如何使用jSON.NET和JObject.Parse从JSON中提取值

时间:2014-10-05 16:02:54

标签: c# json json.net

我有一个非常简单的C#程序,它进行URL调用并检索jSON字符串。这很好。

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的新手,我想从这篇文章中提取lat和lng值:

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

但在我称之为JObject.Parse之后真的不知道如何去做。

2 个答案:

答案 0 :(得分: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,它值得您解决问题

答案 1 :(得分:1)

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

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