C# 中的 Google 地理编码 Json 解析问题

Posted

技术标签:

【中文标题】C# 中的 Google 地理编码 Json 解析问题【英文标题】:Google Geocoding Json Parsing Issue in C# 【发布时间】:2015-04-06 22:12:49 【问题描述】:

我的代码工作正常,但我似乎无法进入树的更深部分。我正在尝试拉经度和纬度。下面的代码将 'status' 拉为 'OK' 没问题(在响应的最后)。'geometry' -> 'location' -> 'lat' 和 'lng' 的语法是什么?

这是我的代码:

string RawAddress = "163 Leektown Road, New Gretna, NJ 08004";
string Address = RawAddress.Replace(" ", "+");
string AddressURL = "http://maps.google.com/maps/api/geocode/json?address=" + Address;
var result = new System.Net.WebClient().DownloadString(AddressURL);
dynamic data = JObject.Parse(result);

Lat.Text = data.status;

这是 API 生成的内容:


   "results" : [
  
     "address_components" : [
        
           "long_name" : "Mountain View",
           "short_name" : "Mountain View",
           "types" : [ "locality", "political" ]
        ,
        
           "long_name" : "Santa Clara County",
           "short_name" : "Santa Clara County",
           "types" : [ "administrative_area_level_2", "political" ]
        ,
        
           "long_name" : "California",
           "short_name" : "CA",
           "types" : [ "administrative_area_level_1", "political" ]
        ,
        
           "long_name" : "United States",
           "short_name" : "US",
           "types" : [ "country", "political" ]
        
     ],
     "formatted_address" : "Mountain View, CA, USA",
     "geometry" : 
        "bounds" : 
           "northeast" : 
              "lat" : 37.4508789,
              "lng" : -122.0446721
           ,
           "southwest" : 
              "lat" : 37.3567599,
              "lng" : -122.1178619
           
        ,
        "location" : 
           "lat" : 37.3860517,
           "lng" : -122.0838511
        ,
        "location_type" : "APPROXIMATE",
        "viewport" : 
           "northeast" : 
              "lat" : 37.4508789,
              "lng" : -122.0446721
           ,
           "southwest" : 
              "lat" : 37.3567599,
              "lng" : -122.1178619
           
        
     ,
     "partial_match" : true,
     "types" : [ "locality", "political" ]
  
  ],
  "status" : "OK"
  

【问题讨论】:

How to parse json in C#? 的可能重复项 尝试将 Json 粘贴到此页面:json2csharp.com MethodMan,谢谢。我已经看到了,但它没有帮助。聚会,因为我不知道我应该使用什么命名空间。我对我发布的内容很满意,因为它确实有效。 Lasse V. Karlsen,也谢谢你,但我无法理解它。如何将它们插入? 【参考方案1】:

以下是获得所需内容的步骤:

    在http://json2csharp.com/ 中发布您的 JSON。获取生成的类并合并重复项,您会得到:

    public class AddressComponent
    
        public string long_name  get; set; 
        public string short_name  get; set; 
        public List<string> types  get; set; 
    
    
    public class Bounds
    
        public Location northeast  get; set; 
        public Location southwest  get; set; 
    
    
    public class Location
    
        public double lat  get; set; 
        public double lng  get; set; 
    
    
    public class Geometry
    
        public Bounds bounds  get; set; 
        public Location location  get; set; 
        public string location_type  get; set; 
        public Bounds viewport  get; set; 
    
    
    public class Result
    
        public List<AddressComponent> address_components  get; set; 
        public string formatted_address  get; set; 
        public Geometry geometry  get; set; 
        public bool partial_match  get; set; 
        public List<string> types  get; set; 
    
    
    public class RootObject
    
        public List<Result> results  get; set; 
        public string status  get; set; 
    
    

    (您也可以使用Paste JSON as Classes 或https://jsonutils.com/ 来生成初始类型定义。)

    使用Json.NET 反序列化您的 JSON,如下所示:

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

    您的查询返回了多个结果,因此您需要像这样遍历返回的位置:

        foreach (var singleResult in root.results)
        
            var location = singleResult.geometry.location;
            var latitude = location.lat;
            var longitude = location.lng;
            // Do whatever you want with them.
        
    

【讨论】:

工作就像一个魅力。谢谢你这样拼写。我唯一要添加的是使这项工作正常工作的确切名称空间:Newtonsoft.Json。 很好的答案。不知道http://json2csharp.com/的存在。很有用!【参考方案2】:

'geometry' -> 'location' -> 'lat' 和 'lng' 的语法是:

JObject data = JObject.Parse(result);

string lat = (string)data["results"][0]["geometry"]["location"]["lat"];
string lng = (string)data["results"][0]["geometry"]["location"]["lng"];

【讨论】:

以上是关于C# 中的 Google 地理编码 Json 解析问题的主要内容,如果未能解决你的问题,请参考以下文章

在C#中通过使用Newtonsoft.Json库来解析天地图地理编码(GeoCoder)服务接口返回的Json格式的数据,以及HttpWebRequest 设置不完全时服务器返回“远程服务器返回错误:

如何从 C# 代码调用 Google 地理编码服务

C# Google 地理编码:即使遵循所需的步骤,也会不断拒绝权限

iPhone Google JSON Geocoing 解析

如何在 iOS 中解析 mapquest 地理编码 JSON

C# 使用 Newtonsoft 解析 JSON