2014-10-05 192 views
0

我有一个非常简单的C#程序,它可以进行URL调用并检索jSON字符串。这工作正常。如何从JSON中使用jSON.NET和JObject.Parse提取值

static void Main(string[] args) 
{ 
    using (var webClient = new System.Net.WebClient()) 
    { 
     var json = webClient.DownloadString("http://maps.google.com/maps/api/geocode/json?address=Oak%20Openings%20Metro%20Park%20Ohio&sensor=false); 

     var obj = JObject.Parse(json); 
    } 
} 

的JSON返回如下所示:

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Oak Openings Preserve Metropark", 
       "short_name" : "Oak Openings Preserve Metropark", 
       "types" : [ "establishment" ] 
      }, 
      { 
       "long_name" : "Girdham Road", 
       "short_name" : "Girdham Rd", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Swanton", 
       "short_name" : "Swanton", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Ohio", 
       "short_name" : "OH", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "43558", 
       "short_name" : "43558", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "Oak Openings Preserve Metropark, Girdham Road, Swanton, OH 43558, USA", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 41.5828434, 
        "lng" : -83.82480509999999 
       }, 
       "southwest" : { 
        "lat" : 41.5286092, 
        "lng" : -83.8826873 
       } 
      }, 
      "location" : { 
       "lat" : 41.5517744, 
       "lng" : -83.85260359999999 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 41.5828434, 
        "lng" : -83.82480509999999 
       }, 
       "southwest" : { 
        "lat" : 41.5286092, 
        "lng" : -83.8826873 
       } 
      } 
     }, 
     "partial_match" : true, 
     "types" : [ "park", "establishment" ] 
     }, 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Oak Openings Metropark Lodge", 
       "short_name" : "Oak Openings Metropark Lodge", 
       "types" : [ "point_of_interest", "establishment" ] 
      }, 
      { 
       "long_name" : "5230", 
       "short_name" : "5230", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Wilkins Road", 
       "short_name" : "Wilkins Rd", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Whitehouse", 
       "short_name" : "Whitehouse", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Swanton", 
       "short_name" : "Swanton", 
       "types" : [ "administrative_area_level_3", "political" ] 
      }, 
      { 
       "long_name" : "Lucas County", 
       "short_name" : "Lucas County", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Ohio", 
       "short_name" : "OH", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "43571", 
       "short_name" : "43571", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "Oak Openings Metropark Lodge, 5230 Wilkins Road, Whitehouse, OH 43571, USA", 
     "geometry" : { 
      "location" : { 
       "lat" : 41.5483617, 
       "lng" : -83.8395838 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 41.5497106802915, 
        "lng" : -83.83823481970849 
       }, 
       "southwest" : { 
        "lat" : 41.5470127197085, 
        "lng" : -83.84093278029151 
       } 
      } 
     }, 
     "partial_match" : true, 
     "types" : [ "park", "point_of_interest", "establishment" ] 
     } 
    ], 
    "status" : "OK" 
} 

我很新的JSON,我想从这块提取的纬度和经度值:

"location": { 
       "lat": 27.9094665, 
       "lng": -82.7873244 
      }, 

但在我调用JObject.Parse之后,真的不知道该如何去做。

+0

可能重复[使用Json.NET来解析由Google Maps API返回的结果](http://stackoverflow.com/questions/7515679/using-json-net-to -parse-result-returned-by-google-maps-api) – 2014-10-05 17:36:28

+0

另请参阅:[使用Json.Net解析Google地图Geocode API](http://stackoverflow.com/q/18021084/10263) – 2014-10-05 17:37:38

回答

2

您可以使用LINQ to JSON。你的路径位置的:

results/geometry/location/lat 
results/geometry/location/lng 

得好:

var response = webClient.DownloadString("http://maps.google.com/maps/api/geocode/json?address=Oak%20Openings%20Metro%20Park%20Ohio&sensor=false); 

现在选择的位置:

JObject json = JObject.Parse(response); 

int lat = (int)json["results"]["geometry"]["location"]["lat"]; 
int lng = (int)json["results"]["geometry"]["location"]["lng"]; 

这里是你的问题的文件: http://james.newtonking.com/json/help/index.html?topic=html/M_Newtonsoft_Json_JsonConvert_DeserializeObject__1.htm

http://james.newtonking.com/json/help/index.html?topic=html/QueryingLINQtoJSON.htm

P.S我现在不能尝试,但我认为它可以帮助你或给出解决方案。请搜索nodeJson,这是值得你的问题

+0

不完全正确。但足够接近让我找出如何做到这一点。谢谢。 – 2014-10-05 17:34:30

1

它比较简单。您使用的框架不同于我通常使用的部分,所以我不确定如何使用JObject和其他J类型来完成此操作。我相信它们在使用dynamic对象时很有用,在这种情况下,您只需通过属性将动态对象编入索引。或者通过框架,我不确定。

我通常会做的是创建json对象的POCO对象表示,然后使用JsonConvert.DeserializeObject<T>将json反序列化为我可以在应用程序中使用的东西。