【问题标题】:Bing-Rest-Api Get Route from Response.ResourceSetsBing-Rest-Api 从 Response.ResourceSets 获取路由
【发布时间】:2014-08-13 22:27:25
【问题描述】:

我正在对 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 对象:

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

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

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

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

谢谢 汤姆

【问题讨论】:

    标签: json rest bing-api


    【解决方案1】:

    汤姆,

    在我将数据合约复制到我的解决方案后,通过对数据合约进行一些小的更改,我能够让这些相同的数据合约 (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; }
    }
    

    一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2011-08-05
      • 2017-01-21
      • 2021-11-30
      相关资源
      最近更新 更多