2012-04-02 29 views
0

嗨,爲什麼我得到一個inalid演員異常?無效的演員異常,JSON,Windows手機

public class RootContainer2 
    { 
      [DataMember] 
      public string StopName { get; set; } 

      [DataMember] 
      public string StopId { get; set; } 

      [DataMember] 
      public string Stop { get; set; } 

      [DataMember] 
      public ObservableCollection<Stops> Stops { get; set; } 
    } 

     private void ContentPanel_Loaded(object sender, RoutedEventArgs e) 
     { 
      textRouteId.Text = this.NavigationContext.QueryString["name"]; 

      string myvar = textRouteId.Text; 

      try 
      { 
       WebClient webClient = new WebClient(); 
       Uri uri = new Uri("websiteurl"); 
       webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted); 
       webClient.OpenReadAsync(uri); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
     { 
      DataContractJsonSerializer ser = null; 

      try 
      { 
       ser = new DataContractJsonSerializer(typeof(RootContainer2)); 
       RootContainer2 rootContainer = ser.ReadObject(e.Result) as RootContainer2; 
       foreach (Stops em in rootContainer.Stops) 
       { 

        string df = em.StopName; 
        string dt = em.StopId; 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

這是我試圖讀取的json輸出,但我得到一個無效的轉換異常。

{"RouteId": "1231", "RouteName":"1 Whitehawk - Mile Oak", "Stops": [ { "StopId":"6882", "StopName":"Swanborough Drive", "OperatorsCode4":"bridmpj", "Lat":"50.8326729229821", "Lng":"-0.103217996656901" } , { "StopId":"6883", "StopName":"Haybourne Road", "OperatorsCode4":"brimapm", "Lat":"50.8317788816436", "Lng":"-0.10486427645364671" } , { "StopId":"6884", "StopName":"Coolham Drive", "OperatorsCode4":"brijtwm", "Lat":"50.829695439856089", "Lng":"-0.10512229365031489" } , { "StopId":"6885", "StopName":"St Cuthmans Church", "OperatorsCode4":"briapdg", "Lat":"50.8283233642578", "Lng":"-0.104808002710342" } , 

加上stops.cs類:

public class Stops 
{ 
    public string StopId { get; set; } 
    public string StopName { get; set; } 
} 

編輯:

所以創造我自己的URL,然後測試數據後,它的東西做,我是URL給我想。只是做進一步的測試。

編輯2

如果我把數據轉換成文本文件和調試數據,它的工作原理,如果我做到以下幾點。

在進料結束時是這樣的:

「LNG」: 「 - 0.277833998203278」, 「」}]}

如果我刪除,和 「」,那麼它的工作原理。但我該如何阻止它首先到達那裏?

+1

異常的*細節*是什麼? – 2012-04-02 10:51:41

+0

當我調試它時,當它到達這一行的末尾: RootContainer2 rootContainer = ser.ReadObject(e.Result)as RootContainer2; 它直接結束並顯示錯誤消息,它只是 「InvalidCastException」 – 2012-04-02 11:28:21

+0

這是因爲您只顯示異常的*消息*。您應該能夠獲得比這更多的信息,例如堆棧跟蹤。 – 2012-04-02 11:35:20

回答

0

該例外可能由於缺少[DataContract][DataMember]屬性,特別是在Stops類中造成。除Silverlight 5之外,DataContract是一個可選模型,其中應該序列化的所有類和屬性都必須帶有顯式屬性。

更新

您的評論後,我已經看了詳細到您收到JSON數據。您提供了兩件JSON。如果合併,它們看起來像這樣:

{ 
    "RouteId": "1231", 
    "RouteName": "1 Whitehawk - Mile Oak", 
    "Stops": [ 
     { 
      "StopId": "6882", 
      "StopName": "Swanborough Drive", 
      "OperatorsCode4": "bridmpj", 
      "Lat": "50.8326729229821", 
      "Lng": "-0.103217996656901" 
     }, 
     { 
      "StopId": "6883", 
      "StopName": "Haybourne Road", 
      "OperatorsCode4": "brimapm", 
      "Lat": "50.8317788816436", 
      "Lng": "-0.10486427645364671" 
     }, 
     { 
      "StopId": "6884", 
      "StopName": "Coolham Drive", 
      "OperatorsCode4": "brijtwm", 
      "Lat": "50.829695439856089", 
      "Lng": "-0.10512229365031489" 
     }, 
     { 
      "StopId": "6885", 
      "StopName": "St Cuthmans Church", 
      "OperatorsCode4": "briapdg", 
      "Lat": "50.8283233642578", 
      "Lng": "-0.277833998203278", 
      "" 
     } 
    ] 
} 

恐怕這對於JSON來說簡直是無效的。當你發現自己有一個額外的逗號和一對額外的引號接近尾聲。他們會區分正確和無效的JSON。您可以使用像Onlne JSON驗證程序(如JSONLint)進行檢查。

最好的解決方案是,如果你可以修復它在服務器端。否則,最好在將數據傳遞到序列化程序之前嘗試修復數據。

+0

檢查編輯2以獲取更新 – 2012-04-02 15:00:17

+0

嗨,感謝您將結果添加到驗證程序中,即使其中的其他內容仍然有效。但最終不能與此相提並論 - 「,」 – 2012-04-03 11:09:39

0

ReadObject()需要Stream(或某些XML相關類型),但e.Result是object類型。

嘗試:

RootContainer2 rootContainer = ser.ReadObject((Stream)e.Result) as RootContainer2; 

編輯:退一步來說,這可能會拋出一個無效的參數異常,而不是無效的轉換。

看起來像ReadObject()返回的對象不能澆注到類型RootContainer2

+0

它仍然跳過後,並顯示錯誤信息。 – 2012-04-02 12:23:48

+0

是的,在發佈後認識到,如果是這樣的話,那將是一個不同的錯誤。不應該您的RootContainer2類具有RouteId和RouteName的屬性而不是StopId和StopName? – Nomad101 2012-04-02 12:35:58

+0

我想盡一切努力。 – 2012-04-02 12:36:50