Metro风格应用程序:JSON对象反序列化错误,REST服务

时间:2012-08-31 14:41:17

标签: json.net deserialization bing-maps

  

元素':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
      ],

1 个答案:

答案 0 :(得分:0)

请看一下这篇博文:http://rbrundritt.wordpress.com/2012/01/06/bing-maps-rest-service-net-libraries/

它包含了序列化REST服务所需的所有库。对于您看到的错误,您需要创建一个名为Route的类,并将其标记为资源类上的已知类型。

例如:

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