元素":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资源类,我得到了这个异常:
应为状态"Element"。。遇到名为"、命名空间为"的"文本"
喜欢: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
],
看看这篇博客文章: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