嗨,为什么我得到inalid强制转换异常?
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" } ,
加上中途停留的课程:
public class Stops
{
public string StopId { get; set; }
public string StopName { get; set; }
}
编辑:
因此,在创建了我自己的url并测试了数据之后,我认为这与我得到的url有关。只是在做进一步的测试。
编辑2
如果我将数据放入一个文本文件并调试数据,那么如果我执行以下操作,它就会工作。
馈送的结尾是这样的:
"Lng":"-0.277833998203278","}]}
如果我删除和",那么它就起作用了。但我该如何从一开始就阻止它到达那里呢?
异常可能是由于缺少[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来说根本无效。正如你自己发现的那样,结尾处多了一个逗号和一对emtpy引号。它们区分了正确和无效的JSON。您可以使用像JSONLint这样的联机JSON验证器进行检查。
最好的解决方案是在服务器端进行修复。否则,最好在将数据传递到序列化程序之前尝试修复数据。
ReadObject()
采用Stream(或一些与XML相关的类型),但e.Result
属于object类型。
尝试:
RootContainer2 rootContainer = ser.ReadObject((Stream)e.Result) as RootContainer2;
编辑:仔细想想,这可能会引发Invalid Parameter异常,而不是Invalid Cast。
看起来ReadObject()
返回的对象不能转换为RootContainer2
类型。