C# 在datamember上反序列化JSON时出现问题__“类型”;
简而言之,我正在尝试反序列化Bing地图地理编码REST API的JSON响应 我创建了我的响应类,现在当我尝试实际反序列化响应时,出现以下错误: 不应使用数据协定名称为{1}:{2}的类型{0}。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASER的已知类型列表中。 它正在尝试反序列化这行JSON,但失败:C# 在datamember上反序列化JSON时出现问题__“类型”;,c#,visual-studio,json,serialization,C#,Visual Studio,Json,Serialization,简而言之,我正在尝试反序列化Bing地图地理编码REST API的JSON响应 我创建了我的响应类,现在当我尝试实际反序列化响应时,出现以下错误: 不应使用数据协定名称为{1}:{2}的类型{0}。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASER的已知类型列表中。 它正在尝试反序列化这行JSON,但失败: "__type": "Location:http:
"__type": "Location:http:\/\/schemas.microsoft.com\/search\/local\/ws\/rest\/v1",
我的反应课是这样的
[DataContract]
public class GeoResponse
{
[DataMember(Name = "statusDescription")]
public string StatusDescription { get; set; }
[DataMember(Name = "statusCode")]
public string StatusCode { get; set; }
[DataMember(Name = "resourceSets")]
public ResourceSet[] resourceSets { get; set; }
[DataContract]
public class ResourceSet
{
[DataMember(Name = "__type", IsRequired=false)]
public string type { get; set; }
[DataMember(Name = "estimatedTotal")]
public string EstimatedTotal { get; set; }
[DataMember(Name = "resources")]
public List<Resources> resources { get; set; }
[DataContract]
public class Resources
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "point")]
public Point point { get; set; }
[DataContract]
public class Point
{
[DataMember(Name = "type")]
public string Type { get; set; }
[DataMember(Name = "coordinates")]
public string[] Coordinates { get; set; }
}
[DataMember(Name = "address")]
public Address address { get; set; }
[DataContract]
public class Address
{
[DataMember(Name = "addressLine")]
public string AddressLine { get; set; }
[DataMember(Name = "countryRegion")]
public string CountryRegion { get; set; }
[DataMember(Name = "formattedAddress")]
public string FormattedAddress { get; set; }
[DataMember(Name = "locality")]
public string Locality { get; set; }
[DataMember(Name = "postalCode")]
public string PostalCode { get; set; }
}
[DataMember(Name = "confidence")]
public string Confidence { get; set; }
[DataMember(Name = "entityType")]
public string EntityType { get; set; }
}
}
}
}
首先,请注意,您引用的方法()生成的响应与您试图映射到DataContract类的响应不同。这里描述了响应: 我已经为该响应创建了一个DataContract: [DataContract] public class LocationQueryResponse { [DataMember] public string authenticationResultCode { get; set; } [DataMember] public string brandLogoUri { get; set; } [DataMember] public string copyright { get; set; } [DataMember] public string statusCode { get; set; } [DataMember] public string statusDescription { get; set; } [DataMember] public string traceId { get; set; } [DataMember] public ResourceSet[] resourceSets { get; set; } [DataContract] public class ResourceSet { [DataMember] public int estimatedTotal { get; set; } [DataMember] public Resource[] resources { get; set; } [DataContract(Namespace = "http://schemas.microsoft.com/search/local/ws/rest/v1", Name="Location")] public class Resource { [DataMember] public string __type { get; set; } [DataMember] public double[] bbox { get; set; } [DataMember] public string name { get; set; } [DataMember] public Point point { get; set; } [DataContract] public class Point { [DataMember] public string type { get; set; } [DataMember] public string[] coordinates { get; set; } } [DataMember] public Address address { get; set; } [DataContract] public class Address { [DataMember] public string addressLine { get; set; } [DataMember] public string adminDistrict { get; set; } [DataMember] public string adminDistrict2 { get; set; } [DataMember] public string countryRegion { get; set; } [DataMember] public string formattedAddress { get; set; } [DataMember] public string locality { get; set; } [DataMember] public string postalCode { get; set; } } [DataMember] public string confidence { get; set; } [DataMember] public string entityType { get; set; } } } } [数据合同] 公共类位置查询响应 { [数据成员] 公共字符串身份验证结果代码{get;set;} [数据成员] 公共字符串brandLogoUri{get;set;} [数据成员] 公共字符串版权{get;set;} [数据成员] 公共字符串状态码{get;set;} [数据成员] 公共字符串statusDescription{get;set;} [数据成员] 公共字符串traceId{get;set;} [数据成员] 公共资源集[]资源集{get;set;} [数据合同] 公共类资源集 { [数据成员] public int estimatedTotal{get;set;} [数据成员] 公共资源[]资源{get;set;} [DataContract(命名空间=”http://schemas.microsoft.com/search/local/ws/rest/v1“,Name=“Location”)] 公共类资源 { [数据成员] 公共字符串uu类型{get;set;} [数据成员] public double[]bbox{get;set;} [数据成员] 公共字符串名称{get;set;} [数据成员] 公共点{get;set;} [数据合同] 公共课点 { [数据成员] 公共字符串类型{get;set;} [数据成员] 公共字符串[]坐标{get;set;} } [数据成员] 公共广播地址{get;set;} [数据合同] 公共课堂演讲 { [数据成员] 公共字符串地址行{get;set;} [数据成员] 公共字符串adminDistrict{get;set;} [数据成员] 公共字符串adminDistrict2{get;set;} [数据成员] 公共字符串countryRegion{get;set;} [数据成员] 公共字符串格式化地址{get;set;} [数据成员] 公共字符串位置{get;set;} [数据成员] 公共字符串postalCode{get;set;} } [数据成员] 公共字符串置信度{get;set;} [数据成员] 公共字符串entityType{get;set;} } } } 起初,即使我创建了一个正确的DataContract,它也不起作用,并且它生成了与您呈现的相同的异常。经过一些研究,我发现“_type”字段对DataContractJsonSerializer有特殊的意义,表示对象应该反序列化到的类型。为了实现这一点,我在资源类的DataContract属性中添加了Name和Namespace属性(请检查上面的代码) 我对WCF和JSON有相当多的经验,以前从未遇到过这个问题。这似乎是一个相当模糊的字段,_类型字段似乎不符合标准,而是Microsoft特有的功能。相当恼人的是_类型字段似乎只在某些特定情况下才有效。例如,如果在JSON文档中,前面有空格,反序列化程序将忽略它,并且不会引发任何异常。我最初用于测试的文档中有这样一个空白,这就是我当时没有出错的原因
希望这一点最终有所帮助。:) 它工作起来很有魅力,非常感谢,名称空间实际上修复了它。看起来确实是微软独有的东西,因为我对谷歌和雅虎也是如此!地理编码API和那里的一切工作!谢谢谢谢你,伙计。就我所知,_类型值只有在对象中首先出现时才起作用。如果它有其他的位置,则不抛出异常,分析器不认为它是特殊的值。谢谢我不得不更改代码中的一些引用,但这与找出问题相比很容易。 [DataContract] public class LocationQueryResponse { [DataMember] public string authenticationResultCode { get; set; } [DataMember] public string brandLogoUri { get; set; } [DataMember] public string copyright { get; set; } [DataMember] public string statusCode { get; set; } [DataMember] public string statusDescription { get; set; } [DataMember] public string traceId { get; set; } [DataMember] public ResourceSet[] resourceSets { get; set; } [DataContract] public class ResourceSet { [DataMember] public int estimatedTotal { get; set; } [DataMember] public Resource[] resources { get; set; } [DataContract(Namespace = "http://schemas.microsoft.com/search/local/ws/rest/v1", Name="Location")] public class Resource { [DataMember] public string __type { get; set; } [DataMember] public double[] bbox { get; set; } [DataMember] public string name { get; set; } [DataMember] public Point point { get; set; } [DataContract] public class Point { [DataMember] public string type { get; set; } [DataMember] public string[] coordinates { get; set; } } [DataMember] public Address address { get; set; } [DataContract] public class Address { [DataMember] public string addressLine { get; set; } [DataMember] public string adminDistrict { get; set; } [DataMember] public string adminDistrict2 { get; set; } [DataMember] public string countryRegion { get; set; } [DataMember] public string formattedAddress { get; set; } [DataMember] public string locality { get; set; } [DataMember] public string postalCode { get; set; } } [DataMember] public string confidence { get; set; } [DataMember] public string entityType { get; set; } } } }