【问题标题】:Google Maps API - Read place details from JSON responseGoogle Maps API - 从 JSON 响应中读取地点详细信息
【发布时间】:2019-02-05 13:52:03
【问题描述】:

好的,我终于从 Google Places API 获得了我一直在寻找的响应。响应由每个地址字段分隔。但现在,我只想检索这些字段。

例如,如何从下面的 json 中检索门牌号 (90)?

到目前为止我的代码:

string url = @"https://maps.googleapis.com/maps/api/place/details/json?placeid=" +
                  placeId + "&language=pt-BR&key=AIzaSyDYQ6IIsukjFEQ5VEaxL2VgLf8kRLSXuBM";

var result = new WebClient().DownloadString(url);

dynamic detalhes = JsonConvert.DeserializeObject(result);

以下是部分回复:

{
   "html_attributions" : [],
   "result" : {
      "address_components" : [
         {
            "long_name" : "Casa A",
            "short_name" : "Casa A",
            "types" : [ "subpremise" ]
         },
         {
            "long_name" : "90",
            "short_name" : "90",
            "types" : [ "street_number" ]
         },
         {
            "long_name" : "Rua Carlos",
            "short_name" : "R. Carlos",
            "types" : [ "route" ]
         },
         {
            "long_name" : "Campo Belo",
            "short_name" : "Campo Belo",
            "types" : [ "sublocality_level_1", "sublocality", "political" ]
         },
         {
            "long_name" : "São Paulo",
            "short_name" : "São Paulo",
            "types" : [ "administrative_area_level_2", "political" ]
         },
         {
            "long_name" : "São Paulo",
            "short_name" : "SP",
            "types" : [ "administrative_area_level_1", "political" ]
         },
         {
            "long_name" : "13450-050",
            "short_name" : "13450-050",
            "types" : [ "postal_code" ]
         }

【问题讨论】:

    标签: c# json google-places-api


    【解决方案1】:

    尝试为您的 JSON 创建模型:

    public class Response
    {
        public ResponseResult Result{ get; set; }
    }
    public class ResponseResult
    {
        public ResponseResultAddress[] Address_Components{ get; set; }
    }
    
    public class ResponseResultAddress
    {
        public string Long_Name { get; set; }
        public string Short_Name { get; set; }
        public string[] Types { get; set; }
    }
    
    
    var data = JsonConvert.DeserializeObject<Response>(result);
    var street = data.Result.Address_Components.FirstOrDefault(item => item.Long_name == "90" && item.Types.Contains("street_number"));
    

    【讨论】:

      【解决方案2】:

      您可以使用json2csharp 等工具从给定的 json 中创建类模型。这将导致如下结果:

      public class AddressComponent
      {
          public string long_name { get; set; }
          public string short_name { get; set; }
          public List<string> types { get; set; }
      }
      
      public class Result
      {
          public List<AddressComponent> address_components { get; set; }
      }
      
      public class RootObject
      {
          public List<object> html_attributions { get; set; }
          public Result result { get; set; }
      }
      

      现在您可以使用 Json.NET 将给定的 json 字符串反序列化为 RootObject 类型的对象:

      var data = JsonConvert.DeserializeObject<RootObject>(result);
      

      要查询反序列化的 data 对象中的 street_number 部分,您可以使用 LINQ:

      var streetNo = data.result.address_components.FirstOrDefault(ac => ac.types.Contains("street_number"))?.long_name;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 2015-07-03
        • 1970-01-01
        相关资源
        最近更新 更多