2012-08-31 3 views
0

L'élément ': item' contient des données d'un type qui correspond au nom "http://schemas.microsoft.com/search/local/ws/rest/v1: Route. ' Le désérialiseur n'a pas connaissance de tout type qui correspond à ce nom Pensez à utiliser un DataContractResolver ou ajoutez le type correspondant à « Route » à la liste des types connus -. Par exemple, en utilisant l'attribut KnownTypeAttribute ou en l'ajoutant à la liste des types connus passés à DataContractSerializer.Application Metro Style: erreur de désérialisation d'objet JSON, services REST


Après avoir ajouté [DataContract (namespace = "http://schemas.microsoft.com/search/local/ws/rest/v1", Name = "Emplacement")] ro Classe de ressources, j'ai reçu cette exception:

état expecting 'élément' .. Rencontrés 'Texte' avec le nom '', '' 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); 
     } 
    } 

Le problème est ici:

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

Répondre

0

Prenez un coup d'oeil à cet article de blog: http://rbrundritt.wordpress.com/2012/01/06/bing-maps-rest-service-net-libraries/

Il a tous les librar Vous avez besoin de sérialiser les services REST. Pour l'erreur que vous voyez, vous devez créer une classe appelée Route et la marquer comme un type connu sur la classe de ressources.

Par exemple:

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