2012-04-02 32 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