Metro风格应用:JSON对象反序列化错误,REST服务 [英] Metro Style App: JSON Object Deserialization Error, REST Services

查看:66
本文介绍了Metro风格应用:JSON对象反序列化错误,REST服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

元素':item'包含映射到名称的类型的数据 "http://schemas.microsoft.com/search/local/ws/rest/v1:Route."这 解串器不知道任何映射到该名称的类型. 考虑使用DataContractResolver或添加与 路由"到已知类型的列表-例如,通过使用 KnownTypeAttribute属性或通过将其添加到已知列表中 类型传递给DataContractSerializer.


添加[DataContract(Namespace ="http://schemas.microsoft.com/search/local/ws/rest/v1",Name =" Location)] ro资源类后,出现此异常:

预期状态为'元素'.遇到名称为",名称空间为的'文本'


Likn: http://dev.virtualearth.net/REST/V1/Routes?wp.0=37.779160067439079,-122.42004945874214&wp.1=32.715685218572617,-117.16172486543655&key=BingMapsKey

    [KnownType(typeof(double[]))]
    [DataContract]
    public class ActualEnd
    {
        [DataMember(Name = "type")]
        public string type { get; set; }
        [DataMember(Name = "coordinates")]
        public List<double> coordinates { get; set; }
    }

    [KnownType(typeof(double[]))]
    [DataContract]
    public class ActualStart
    {
        [DataMember(Name = "type")]
        public string type { get; set; }
        [DataMember(Name = "coordinates")]
        public List<double> coordinates { get; set; }
    }


    [KnownType(typeof(int[]))]
    [KnownType(typeof(string[]))]
    [DataContract]
    public class Detail
    {
        [DataMember(Name = "compassDegrees")]
        public int compassDegrees { get; set; }
        [DataMember(Name = "endPathIndices")]
        public List<int> endPathIndices { get; set; }
        [DataMember(Name = "maneuverType")]
        public string maneuverType { get; set; }
        [DataMember(Name = "mode")]
        public string mode { get; set; }
        [DataMember(Name = "roadType")]
        public string roadType { get; set; }
        [DataMember(Name = "startPathIndices")]
        public List<int> startPathIndices { get; set; }
        [DataMember(Name = "names")]
        public List<string> names { get; set; }
    }

    [DataContract]
    public class Instruction
    {
        [DataMember(Name = "maneuverType")]
        public string maneuverType { get; set; }
        [DataMember(Name = "text")]
        public string text { get; set; }
    }

    [KnownType(typeof(double[]))]
    [DataContract]
    public class ManeuverPoint
    {
        [DataMember(Name = "type")]
        public string type { get; set; }
        [DataMember(Name = "coordinates")]
        public List<double> coordinates { get; set; }
    }

    [DataContract]
    public class Hint
    {
        [DataMember(Name = "hintType")]
        public object hintType { get; set; }
        [DataMember(Name = "text")]
        public string text { get; set; }
    }

    [KnownType(typeof(Detail[]))]
    [KnownType(typeof(Instruction))]
    [KnownType(typeof(Hint[]))]
    [KnownType(typeof(ManeuverPoint))]
    [KnownType(typeof(string[]))]
    [DataContract]
    public class ItineraryItem
    {
        [DataMember(Name = "compassDirection")]
        public string compassDirection { get; set; }
        [DataMember(Name = "details")]
        public List<Detail> details { get; set; }
        [DataMember(Name = "exit")]
        public string exit { get; set; }
        [DataMember(Name = "iconType")]
        public string iconType { get; set; }
        [DataMember(Name = "instruction")]
        public Instruction instruction { get; set; }
        [DataMember(Name = "maneuverPoint")]
        public ManeuverPoint maneuverPoint { get; set; }
        [DataMember(Name = "sideOfStreet")]
        public string sideOfStreet { get; set; }
        [DataMember(Name = "tollZone")]
        public string tollZone { get; set; }
        [DataMember(Name = "towardsRoadName")]
        public string towardsRoadName { get; set; }
        [DataMember(Name = "transitTerminus")]
        public string transitTerminus { get; set; }
        [DataMember(Name = "travelDistance")]
        public double travelDistance { get; set; }
        [DataMember(Name = "travelDuration")]
        public int travelDuration { get; set; }
        [DataMember(Name = "travelMode")]
        public string travelMode { get; set; }
        [DataMember(Name = "signs")]
        public List<string> signs { get; set; }
        [DataMember(Name = "hints")]
        public List<Hint> hints { get; set; }
    }

    [KnownType(typeof(ActualEnd))]
    [KnownType(typeof(ActualStart))]
    [KnownType(typeof(ItineraryItem[]))]
    [DataContract]
    public class RouteLeg
    {
        [DataMember(Name = "actualEnd")]
        public ActualEnd actualEnd { get; set; }
        [DataMember(Name = "actualStart")]
        public ActualStart actualStart { get; set; }
        [DataMember(Name = "itineraryItems")]
        public List<ItineraryItem> itineraryItems { get; set; }
        [DataMember(Name = "travelDistance")]
        public double travelDistance { get; set; }
        [DataMember(Name = "travelDuration")]
        public int travelDuration { get; set; }
    }


    [KnownType(typeof(RouteLeg[]))]
    [KnownType(typeof(double[]))]
    [DataContract(Namespace = "http://schemas.microsoft.com/search/local/ws/rest/v1", Name = "Location")]
    public class Resource
    {
        [DataMember(Name = "__type")]
        public string __type { get; set; }
        [DataMember(Name = "id")]
        public List<double> bbox { get; set; }
        public string id { get; set; }
        [DataMember(Name = "distanceUnit")]
        public string distanceUnit { get; set; }
        [DataMember(Name = "durationUnit")]
        public string durationUnit { get; set; }
        [DataMember(Name = "routeLegs")]
        public List<RouteLeg> routeLegs { get; set; }
        [DataMember(Name = "travelDistance")]
        public double travelDistance { get; set; }
        [DataMember(Name = "travelDuration")]
        public int travelDuration { get; set; }
    }

    [KnownType(typeof(Resource[]))]
    [DataContract]
    public class ResourceSet
    {
        [DataMember(Name = "estimatedTotal")]
        public int estimatedTotal { get; set; }
        [DataMember(Name = "resources")]
        public List<Resource> resources { get; set; }
    }

    [KnownType(typeof(ResourceSet[]))]
    [DataContract]
    public class RootObject
    {
        [DataMember(Name = "authenticationResultCode")]
        public string authenticationResultCode { get; set; }
        [DataMember(Name = "brandLogoUri")]
        public string brandLogoUri { get; set; }
        [DataMember(Name = "copyright")]
        public string copyright { get; set; }
        [DataMember(Name = "resourceSets")]
        public List<ResourceSet> resourceSets { get; set; }
        [DataMember(Name = "statusCode")]
        public int statusCode { get; set; }
        [DataMember(Name = "statusDescription")]
        public string statusDescription { get; set; }
        [DataMember(Name = "traceId")]
        public string traceId { get; set; }
    }

    public async void MakeRequest(string requestUrl)
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
            using (HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse)
            {
                if (response.StatusCode != HttpStatusCode.OK)
                    throw new Exception(string.Format(
                    "Server error(HTTP {0}:{1}.",
                    response.StatusCode,
                    response.StatusDescription));
                DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(RootObject));
                object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
                root = (RootObject)objResponse;      
            }
        }
        catch (Exception ex)
        {
            ThrowException(ex);
        }
    }

问题在这里:

 "estimatedTotal": 1,
  "resources": [
    {
      "__type": "Route:http:\/\/schemas.microsoft.com\/search\/local\/ws\/rest\/v1",
      "bbox": [
        32.715692,
        -122.420697,
        37.827532,
        -117.161052
      ],

解决方案

看看此博客文章:


After adding [DataContract(Namespace = "http://schemas.microsoft.com/search/local/ws/rest/v1", Name = "Location")] ro Resource class, I got this exception:

Expecting state 'Element'.. Encountered 'Text' with name '', namespace ''


Likn: http://dev.virtualearth.net/REST/V1/Routes?wp.0=37.779160067439079,-122.42004945874214&wp.1=32.715685218572617,-117.16172486543655&key=BingMapsKey

    [KnownType(typeof(double[]))]
    [DataContract]
    public class ActualEnd
    {
        [DataMember(Name = "type")]
        public string type { get; set; }
        [DataMember(Name = "coordinates")]
        public List<double> coordinates { get; set; }
    }

    [KnownType(typeof(double[]))]
    [DataContract]
    public class ActualStart
    {
        [DataMember(Name = "type")]
        public string type { get; set; }
        [DataMember(Name = "coordinates")]
        public List<double> coordinates { get; set; }
    }


    [KnownType(typeof(int[]))]
    [KnownType(typeof(string[]))]
    [DataContract]
    public class Detail
    {
        [DataMember(Name = "compassDegrees")]
        public int compassDegrees { get; set; }
        [DataMember(Name = "endPathIndices")]
        public List<int> endPathIndices { get; set; }
        [DataMember(Name = "maneuverType")]
        public string maneuverType { get; set; }
        [DataMember(Name = "mode")]
        public string mode { get; set; }
        [DataMember(Name = "roadType")]
        public string roadType { get; set; }
        [DataMember(Name = "startPathIndices")]
        public List<int> startPathIndices { get; set; }
        [DataMember(Name = "names")]
        public List<string> names { get; set; }
    }

    [DataContract]
    public class Instruction
    {
        [DataMember(Name = "maneuverType")]
        public string maneuverType { get; set; }
        [DataMember(Name = "text")]
        public string text { get; set; }
    }

    [KnownType(typeof(double[]))]
    [DataContract]
    public class ManeuverPoint
    {
        [DataMember(Name = "type")]
        public string type { get; set; }
        [DataMember(Name = "coordinates")]
        public List<double> coordinates { get; set; }
    }

    [DataContract]
    public class Hint
    {
        [DataMember(Name = "hintType")]
        public object hintType { get; set; }
        [DataMember(Name = "text")]
        public string text { get; set; }
    }

    [KnownType(typeof(Detail[]))]
    [KnownType(typeof(Instruction))]
    [KnownType(typeof(Hint[]))]
    [KnownType(typeof(ManeuverPoint))]
    [KnownType(typeof(string[]))]
    [DataContract]
    public class ItineraryItem
    {
        [DataMember(Name = "compassDirection")]
        public string compassDirection { get; set; }
        [DataMember(Name = "details")]
        public List<Detail> details { get; set; }
        [DataMember(Name = "exit")]
        public string exit { get; set; }
        [DataMember(Name = "iconType")]
        public string iconType { get; set; }
        [DataMember(Name = "instruction")]
        public Instruction instruction { get; set; }
        [DataMember(Name = "maneuverPoint")]
        public ManeuverPoint maneuverPoint { get; set; }
        [DataMember(Name = "sideOfStreet")]
        public string sideOfStreet { get; set; }
        [DataMember(Name = "tollZone")]
        public string tollZone { get; set; }
        [DataMember(Name = "towardsRoadName")]
        public string towardsRoadName { get; set; }
        [DataMember(Name = "transitTerminus")]
        public string transitTerminus { get; set; }
        [DataMember(Name = "travelDistance")]
        public double travelDistance { get; set; }
        [DataMember(Name = "travelDuration")]
        public int travelDuration { get; set; }
        [DataMember(Name = "travelMode")]
        public string travelMode { get; set; }
        [DataMember(Name = "signs")]
        public List<string> signs { get; set; }
        [DataMember(Name = "hints")]
        public List<Hint> hints { get; set; }
    }

    [KnownType(typeof(ActualEnd))]
    [KnownType(typeof(ActualStart))]
    [KnownType(typeof(ItineraryItem[]))]
    [DataContract]
    public class RouteLeg
    {
        [DataMember(Name = "actualEnd")]
        public ActualEnd actualEnd { get; set; }
        [DataMember(Name = "actualStart")]
        public ActualStart actualStart { get; set; }
        [DataMember(Name = "itineraryItems")]
        public List<ItineraryItem> itineraryItems { get; set; }
        [DataMember(Name = "travelDistance")]
        public double travelDistance { get; set; }
        [DataMember(Name = "travelDuration")]
        public int travelDuration { get; set; }
    }


    [KnownType(typeof(RouteLeg[]))]
    [KnownType(typeof(double[]))]
    [DataContract(Namespace = "http://schemas.microsoft.com/search/local/ws/rest/v1", Name = "Location")]
    public class Resource
    {
        [DataMember(Name = "__type")]
        public string __type { get; set; }
        [DataMember(Name = "id")]
        public List<double> bbox { get; set; }
        public string id { get; set; }
        [DataMember(Name = "distanceUnit")]
        public string distanceUnit { get; set; }
        [DataMember(Name = "durationUnit")]
        public string durationUnit { get; set; }
        [DataMember(Name = "routeLegs")]
        public List<RouteLeg> routeLegs { get; set; }
        [DataMember(Name = "travelDistance")]
        public double travelDistance { get; set; }
        [DataMember(Name = "travelDuration")]
        public int travelDuration { get; set; }
    }

    [KnownType(typeof(Resource[]))]
    [DataContract]
    public class ResourceSet
    {
        [DataMember(Name = "estimatedTotal")]
        public int estimatedTotal { get; set; }
        [DataMember(Name = "resources")]
        public List<Resource> resources { get; set; }
    }

    [KnownType(typeof(ResourceSet[]))]
    [DataContract]
    public class RootObject
    {
        [DataMember(Name = "authenticationResultCode")]
        public string authenticationResultCode { get; set; }
        [DataMember(Name = "brandLogoUri")]
        public string brandLogoUri { get; set; }
        [DataMember(Name = "copyright")]
        public string copyright { get; set; }
        [DataMember(Name = "resourceSets")]
        public List<ResourceSet> resourceSets { get; set; }
        [DataMember(Name = "statusCode")]
        public int statusCode { get; set; }
        [DataMember(Name = "statusDescription")]
        public string statusDescription { get; set; }
        [DataMember(Name = "traceId")]
        public string traceId { get; set; }
    }

    public async void MakeRequest(string requestUrl)
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
            using (HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse)
            {
                if (response.StatusCode != HttpStatusCode.OK)
                    throw new Exception(string.Format(
                    "Server error(HTTP {0}:{1}.",
                    response.StatusCode,
                    response.StatusDescription));
                DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(RootObject));
                object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
                root = (RootObject)objResponse;      
            }
        }
        catch (Exception ex)
        {
            ThrowException(ex);
        }
    }

The problem is here:

 "estimatedTotal": 1,
  "resources": [
    {
      "__type": "Route:http:\/\/schemas.microsoft.com\/search\/local\/ws\/rest\/v1",
      "bbox": [
        32.715692,
        -122.420697,
        37.827532,
        -117.161052
      ],

解决方案

Take a look at this blog post: http://rbrundritt.wordpress.com/2012/01/06/bing-maps-rest-service-net-libraries/

It has all the libraries you need for serializing the REST services. For the error you are seeing you need to create a class called Route and mark it as a known type on the resource class.

For Example:

[DataContract]
[KnownType(typeof(Location))]
[KnownType(typeof(Route))]
public class Resource

这篇关于Metro风格应用:JSON对象反序列化错误,REST服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆