2016-06-02 4 views
3

Я пытаюсь разобрать json из Google Maps api для геокодирования.C# Получить определенный объект из ответа JSON с использованием HttpClient

JSON является:

{ 
"results" : [ 
    { 
    "address_components" : [ 
     { 
      "long_name" : "1600", 
      "short_name" : "1600", 
      "types" : [ "street_number" ] 
     }, 
     { 
      "long_name" : "Amphitheatre Parkway", 
      "short_name" : "Amphitheatre Pkwy", 
      "types" : [ "route" ] 
     }, 
     { 
      "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" ] 
     }, 
     { 
      "long_name" : "94043", 
      "short_name" : "94043", 
      "types" : [ "postal_code" ] 
     } 
    ], 
    "formatted_address" : "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA", 
    "geometry" : { 
     "location" : { 
      "lat" : 37.4224277, 
      "lng" : -122.0843288 
     }, 
     "location_type" : "ROOFTOP", 
     "viewport" : { 
      "northeast" : { 
       "lat" : 37.4237766802915, 
       "lng" : -122.0829798197085 
      }, 
      "southwest" : { 
       "lat" : 37.4210787197085, 
       "lng" : -122.0856777802915 
      } 
     } 
    }, 
    "place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA", 
    "types" : [ "street_address" ] 
    } 
], 
"status" : "OK" 
} 

Я заинтересован только в location объекта с широтой и долготой, и хотел бы знать, как перемещаться по дереву объектов JSON в C# для извлечения их из HttpContent, как ответ от GetAsync на HttpClient. Следующий фрагмент кода иллюстрирует, как мой запрос выполняется.

public async Task<Coordinates> GeoCode(string address) 
{ 
     HttpClient client= new HttpClient(); 
     var baseUrl = "http://maps.google.com/maps/api/geocode/json?address="; 
     var addressEncoded = WebUtility.UrlEncode(address); 
     var response= await client.GetAsync(baseUrl + addressEncoded); 

     if(response.IsSuccessStatusCode) 
     { 
      //read location ... 
     } 
} 

Как я могу прочитать объект местоположения?

ответ

2

Вот как я обычно делаю это. (Я сохранил свой объект JSON в D: /json.txt)

var json = File.ReadAllText("D:/json.txt"); 
var results = JObject.Parse(json).SelectToken("results") as JArray; 

foreach (var result in results) 
{ 
    var geometryEntry = result.SelectToken("geometry.location"); 
    var longitude = geometryEntry.Value<double>("lat"); 
    var latitude = geometryEntry.Value<double>("lng"); 

    Console.WriteLine("{0}, {1}", longitude, latitude); 
} 

Выход:

enter image description here

+0

Это работает, спасибо большое! – NicolasL

2

Одним из вариантов было бы десериализовать JSON для типизированных классов и другого использования динамических типов.

Using JSON.NET for dynamic JSON parsing

Строка JSON представляет собой объект с тремя свойствами, который проанализированных в класс JObject и приведение к динамическим. После нажатия на динамический я могу перейти к объекту, используя знакомый синтаксис объекта.

public void JValueParsingTest() 
{ 
    var jsonString = @"{""Name"":""Rick"",""Company"":""West Wind"", 
         ""Entered"":""2012-03-16T00:03:33.245-10:00""}"; 

    dynamic json = JValue.Parse(jsonString); 

    // values require casting 
    string name = json.Name; 
    string company = json.Company; 
    DateTime entered = json.Entered; 

    Assert.AreEqual(name, "Rick"); 
    Assert.AreEqual(company, "West Wind");    
} 
+0

Спасибо, динамическое решение выглядит интересно, любая идея, как синтаксический анализ на динамический от ответа. контент? – NicolasL

+0

Просто используйте response.Content.ReadAsStringAsync(), чтобы получить json как System.String и передать его методу Parse. –