Bing-Rest-Api从Response.ResourceSets获取路由

时间:2014-08-13 22:27:26

标签: json rest bing-api

我正在对Bing-Driving Api进行REST调用:

http://dev.virtualearth.net/REST/V1/Routes/Driving?o=json&wp.1=-22.57041,17.11387&wp.2=-22.57623,17.06172&key=...

对反应进行反序列化后:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Response));
r = ser.ReadObject(stream) as Response;

我应该用以下方式获取Route-object:

var route = (r.ResourceSets[0].Resources[0] as Route)

但在我的情况下,r.ResourceSets [0] .Resources [0]只是一个BoundingBox对象! 我如何获得路线?我可以在raw-JSON中看到,一切都在那里。

此处的JSON数据合同已添加到我的项目中:

http://msdn.microsoft.com/en-us/library/jj870778.aspx

由于 汤姆

1 个答案:

答案 0 :(得分:0)

汤姆,

通过在将数据合同复制到我的解决方案后对数据合同进行一些小的更改,我能够在我的项目中获得相同的数据合同(https://msdn.microsoft.com/en-us/library/jj870778.aspx)。我应该注意到我使用Json.Net 6.0.3进行反序列化而不是DataContractJsonSerializer。我不知道这是否有所作为。

首先我改变了这个:

public class Response
{
    [DataMember(Name = "copyright", EmitDefaultValue = false)]
    public string Copyright { get; set; }

    [DataMember(Name = "brandLogoUri", EmitDefaultValue = false)]
    public string BrandLogoUri { get; set; }

    [DataMember(Name = "statusCode", EmitDefaultValue = false)]
    public int StatusCode { get; set; }

    [DataMember(Name = "statusDescription", EmitDefaultValue = false)]
    public string StatusDescription { get; set; }

    [DataMember(Name = "authenticationResultCode", EmitDefaultValue = false)]
    public string AuthenticationResultCode { get; set; }

    [DataMember(Name = "errorDetails", EmitDefaultValue = false)]
    public string[] errorDetails { get; set; }

    [DataMember(Name = "traceId", EmitDefaultValue = false)]
    public string TraceId { get; set; }

    [DataMember(Name = "resourceSets", EmitDefaultValue = false)]
    public ResourceSet[] ResourceSets { get; set; }
}

到此(唯一的变化是向类和ResourceSet属性添加了泛型类型):

public class Response<T>
{
    [DataMember(Name = "copyright", EmitDefaultValue = false)]
    public string Copyright { get; set; }

    [DataMember(Name = "brandLogoUri", EmitDefaultValue = false)]
    public string BrandLogoUri { get; set; }

    [DataMember(Name = "statusCode", EmitDefaultValue = false)]
    public int StatusCode { get; set; }

    [DataMember(Name = "statusDescription", EmitDefaultValue = false)]
    public string StatusDescription { get; set; }

    [DataMember(Name = "authenticationResultCode", EmitDefaultValue = false)]
    public string AuthenticationResultCode { get; set; }

    [DataMember(Name = "errorDetails", EmitDefaultValue = false)]
    public string[] errorDetails { get; set; }

    [DataMember(Name = "traceId", EmitDefaultValue = false)]
    public string TraceId { get; set; }

    [DataMember(Name = "resourceSets", EmitDefaultValue = false)]
    public ResourceSet<T>[] ResourceSets { get; set; }
}

然后我改变了这个:

public class ResourceSet
{
    [DataMember(Name = "estimatedTotal", EmitDefaultValue = false)]
    public long EstimatedTotal { get; set; }

    [DataMember(Name = "resources", EmitDefaultValue = false)]
    public Resource[] Resources { get; set; }
}

到此:

public class ResourceSet<T>
{
    [DataMember(Name = "estimatedTotal", EmitDefaultValue = false)]
    public long EstimatedTotal { get; set; }

    [DataMember(Name = "resources", EmitDefaultValue = false)]
    public T[] Resources { get; set; }
}

一切正常。