2012-04-02 8 views
0

こんにちはなぜインサイドキャスト例外が発生しますか?キャスト例外が無効です、json、windows phone

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; } 
} 

EDIT:

だから、私自身のURLを作成し、データをテストした後、それは私がしたURLとは何かです私は考える。もっとテストをするだけです。

編集2

私は、テキストファイルにデータを入れて、データをデバッグする場合、私は次のことを行うならば、それは動作します。 "私は削除、および場合}]}

"" それが動作 - "0.277833998203278"、":

"LNG":

供給の終了は、次のようです。どのように私は最初にそこに着くのをやめますか?

+1

例外の詳細*は何ですか? –

+0

私はそれをデバッグするとき、この行の最後に達したとき: RootContainer2 rootContainer = RootContainer2としてser.ReadObject(e.Result); これはまっすぐに終了し、エラーメッセージ「 "InvalidCastException"が表示されます –

+0

例外の*メッセージ*だけが表示されているためです。スタックトレースなど、それ以上の情報を得ることができるはずです。 –

答えて

0

特に、Stopsクラスでは、[DataContract]属性と[DataMember]属性が欠落している可能性があります。 Silverlight 5を除き、DataContractはオプトインモデルであり、シリアル化する必要があるすべてのクラスとプロパティは明示的な属性を持つ必要があります。

更新:あなたのコメントの後

、私はあなたが受け取るJSONデータに、より詳細に見てきました。 2つの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では無効です。あなた自身が知っているように、余分なカンマと余分なemtpyのペアが終わり近くにあります。彼らは正しいと無効なJSONの違いを作る。 JSONLintのようなonlne JSONバリデーターでチェックすることができます。

最良の解決策は、サーバー側で修正できる場合です。それ以外の場合は、シリアライザに渡す前にデータを修正することをお勧めします。

+0

私の更新のための編集2を確認してください –

+0

こんにちは、ありがとう、それは余分なものが有効であってもバリデーターに結果を入れた後。しかし、これは最後にはできません - "、 –

0

ReadObject()はStream(またはいくつかのXML関連型)をとりますが、e.Resultはオブジェクト型です。

試してみてください。

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

編集:第二の考えでは、それはおそらく、無効なパラメータ例外ではなく、無効なキャストをスローしていました。

ReadObject()によって返されるオブジェクトは、RootContainer2にキャストできません。

+0

それでも、それ以降の行はスキップされ、エラーメッセージが表示されます。 –

+0

はい、投稿した後に実現した場合、違うエラーになります。あなたのRootContainer2クラスは、StopIdとStopNameの代わりにRouteIdとRouteNameのプロパティを持つべきではありませんか? – Nomad101

+0

私はすべての停止を取得しようとしています。 –

関連する問題