Короче говоря, я пытаюсь десериализации JSON ответ от API Bing Maps геокодирования REST,Проблема с десериализации JSON на DataMember «__type»
я создал свой класс ответа, и теперь, когда я пытаюсь на самом деле десериализовать ответ, я получаю следующую ошибку:
Тип '{0}' с именем контракта данных '{1}: {2}' не ожидается. Подумайте об использовании DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer.
он пытается десериализациями этой строки 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; }
}
}
}
}
Моего метод я использую для десериализации моего ответа JSON:
private static GeoResponse CallGeoWS(string address)
{
string url = string.Format(
"http://dev.virtualearth.net/REST/v1/Locations?q={0}&key={1}",
HttpUtility.UrlEncode(address), bingkey
);
var request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(GeoResponse));
var res = (GeoResponse)serializer.ReadObject(request.GetResponse().GetResponseStream());
return res;
}
Он работал как шарм, благодаря тонне, пространство имен фактически фиксировало его. Кажется, что-то уникальное для Microsoft действительно, потому что я сделал то же самое с Google, и Yahoo! API геокодирования и все работает! благодаря! – Entice
Добро пожаловать! Рад, что смог помочь. –
полезно для меня тоже ... миллион спасибо! –