2016-06-02 3 views
3

Ich versuche, Json aus der Google Maps API für die Geokodierung zu analysieren.C# Abrufen eines bestimmten Objekts aus der JSON-Antwort mit HttpClient

Die JSON ist:

{ 
"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" 
} 

Ich bin nur daran interessiert, im location Objekt mit der Breite, Länge und würde gerne wissen, wie der json Objektbaum in C# navigieren sie zum Abrufen von einem HttpContent als Antwort von einem GetAsync auf einem HttpClient. Das folgende Codefragment veranschaulicht, wie meine Anforderung ausgeführt wird.

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 ... 
     } 
} 

Wie kann ich das Standortobjekt lesen?

Antwort

2

Hier ist, wie ich es in der Regel tun. (I gespeichert Ihr JSON-Objekt in 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); 
} 

Ausgang:

enter image description here

+0

Es funktioniert, vielen Dank! – NicolasL

2

Eine Option wäre, JSON zu typisierten Klassen zu deserialisieren und andere dynamische Typen zu verwenden.

Using JSON.NET for dynamic JSON parsing

Die JSON Zeichenfolge repräsentiert ein Objekt mit drei Eigenschaften, die in eine Klasse JObject und gegossen, um dynamisch analysiert wird. Nach der Umwandlung in Dynamic kann ich dann weitergehen und auf das Objekt zugreifen, indem ich die bekannte Objektsyntax verwende.

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

Dank der dynamische Lösung sieht interessant aus, eine Idee, wie man dynamisch aus der Antwort zu analysieren. Inhalt? – NicolasL

+0

Verwenden Sie einfach response.Content.ReadAsStringAsync(), um JSON als System.String abzurufen und an die Parse-Methode zu übergeben. –

Verwandte Themen