当前位置: 首页 > 编程语言 > C#

在datamember“__type”上反序列化JSON的问题分享

时间:2023-04-10 18:03:35 C#

C#学习教程:在数据成员“__type”上反序列化JSON时出现问题我尝试实际反序列化响应,我收到以下错误:没想到输入数据协定名称为“{1}:{2}”的“{0}”。考虑使用DataContractResolver或将任何静态未知类型添加到已知类型列表中-例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。它试图反应顺序化这一步JSON,并失败:"__type":"Location:http://schemas.microsoft.com/search/local/ws/rest/v1",我的反应类看起来像这样[DataContract]publicclassGeoResponse{[DataMember(Name="statusDescription")]publicstringStatusDescription{get;放;}[DataMember(Name="statusCode")]publicstringStatusCode{get;放;}[DataMember(Name="resourceSets")]publicResourceSet[]resourceSets{get;放;}[DataContract]publicclassResourceSet{[DataMember(Name="__type",IsRequired=false)]publicstringtype{get;放;}[DataMember(Name="estimatedTotal")]publicstringEstimatedTotal{get;放;}[DataMember(Name="resources")]publicListresources{get;放;}[DataContract]publicclassResources{[DataMember(Name="name")]publicstringName{get;放;}[DataMember(Name="point")]publicPoint点{get;放;}[DataContract]publicclassPoint{[DataMember(Name="type")]publicstringType{get;放;}[DataMember(Name="坐标es")]publicstring[]Coordinates{get;set;}}[DataMember(Name="address")]publicAddressaddress{get;set;}[DataContract]公共类地址{[DataMember(Name="addressLine")]publicstringAddressLine{get;set;}[DataMember(Name="countryRegion")]publicstringCountryRegion{get;set;}[DataMember(Name="formattedAddress")]publicstringFormattedAddress{get;set;}[DataMember(Name="locality")]publicstringLocality{get;set;}[DataMember(Name="postalCode")]publicstringPostalCode{get;set;}}[DataMember(Name="confidence")]公共字符串Confidence{get;set;}[DataMember(Name="entityType")]publicstringEntityType{get;set;}}}}}我的方法我用来反序列化我的JSON响应:privatestaticGeoResponseCallGeoWS(stringaddress){stringurl=string.Format("http://dev.virtualearth.net/REST/v1/Locations?q={0}&key={1}",HttpUtility.UrlEncode(address),bingkey);var请求=(HttpWebRequest)HttpWebRequest.Createvar)serializer.ReadObject(request.GetResponse().GetResponseStream());返回资源;首先,请注意您引用的方法(http://dev.virtualearth.net/REST/v1/Locations?q=Wiertzstraat+43+1047+Brussel&key=BingMapsKey)产生的响应与您尝试映射的方法不同数据合约类此处描述了响应:http://msdn.microsoft.com/en-us/library/ff701711.aspx我为响应创建了一个DataContract:团体;}[数据成员]publicstringbrandLogoUri{get;团体;}[数据成员]publicstringcopyright{get;团体;}[数据成员]publicstringstatusCode{get;团体;}[数据成员]publicstringstatusDescription{get;团体;}[数据成员]publicstringtraceId{get;团体;}[数据成员]publicResourceSet[]resourceSets{get;团体;}[DataContract]publicclassResourceSet{[数据成员]publicintestimatedTotal{get;放;}[数据成员]publicResource[]resources{get;放;}[DataContract(Namespace="http://schemas.microsoft.com/search/local/ws/rest/v1",Name="Location")]publicclassresource{[datamember]publicstring__type{get;团体;}[数据成员]publicdouble[]bbox{得到;放;}[数据成员]publicstringname{get;放;}[数据成员]publicpoint{get;放;}[DataContract]publicclasspoint{[datamember]publicstringtype{get;放;}[数据成员]publicstring[]coordinates{get;团体;}}[数据成员]公共地址{get;团体;}[DataContract]publicclassaddress{[datamember]publicstringaddressLine{get;团体;}[数据成员]publicstringadminDistrict{get;团体;}[数据成员]publicstringadminDistrict2{get;团体;}[数据成员]publicstringcountryRegion{get;团体;}[数据成员]publicstringformattedAddress{get;团体;}[数据成员]publicstringlocality{get;放;}[数据成员]公共字符串邮政编码{得到;放;}}[数据成员]publicstringconfidence{get;放;}[数据成员]publicstringentityType{get;放;首先,即使我创建了一个正确的DataContract,它也不起作用,并且它会生成与您提供的相同的异常经过一些研究,我发现“__type”字段对DataContractJsonSerializer具有特殊含义,指示对象应该反序列化的类型。为实现这一点,我将Name和Namespace属性添加到Resource类的DataContract属性中(检查上面的代码)。我对WCF和JSON有很多经验,以前从未遇到过这个问题。这似乎是一个相当模糊的,__type字段似乎不符合标准,而是Microsoft特定的功能。令人恼火的是,__type字段似乎只在某些特定情况下有效。例如,如果JSON文档中有一个前导空格,反序列化器将忽略它并且不会抛出任何异常。我在最初用于测试的文档中有这样一个空白区域,这就是为什么我当时没有得到错误。希望这最终有所帮助。?以上就是C#学习教程:反序列化JSONondatamember"__type"分享的全部内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注-本文来自网络收集,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: