Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在datamember上反序列化JSON时出现问题__“类型”;_C#_Visual Studio_Json_Serialization - Fatal编程技术网

C# 在datamember上反序列化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:

简而言之,我正在尝试反序列化Bing地图地理编码REST API的JSON响应

我创建了我的响应类,现在当我尝试实际反序列化响应时,出现以下错误:

不应使用数据协定名称为{1}:{2}的类型{0}。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASER的已知类型列表中。 它正在尝试反序列化这行JSON,但失败:

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