Как разобрать конкретные веб-сервисы API GoogleMap JSON-ответ - PullRequest
2 голосов
/ 26 декабря 2011

Ответ JSON API Карт Google возвращает разные параметры с одним и тем же существительным:

{
  "status": "OK",
  "results": [ {
    "types": [ "street_address" ],
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "address_components": [ {
      "long_name": "1600",
      "short_name": "1600",
      "types": [ "street_number" ]
    }, {
      "long_name": "Amphitheatre Pkwy",
      "short_name": "Amphitheatre Pkwy",
      "types": [ "route" ]
    }, {
      "long_name": "Mountain View",
      "short_name": "Mountain View",
      "types": [ "locality", "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" ]
    } ],
    "geometry": {
      "location": {
        "lat": 37.4219720,
        "lng": -122.0841430
      },
      "location_type": "ROOFTOP",
      "viewport": {
        "southwest": {
          "lat": 37.4188244,
          "lng": -122.0872906
        },
        "northeast": {
          "lat": 37.4251196,
          "lng": -122.0809954
        }
      }
    }
  } ]
}

Параметр lat и lng существует несколько раз в ответе, например, при условии, что мне нужно получить lat/lng параметра местоположения:

"location": {
            "lat": 37.4219720,
            "lng": -122.0841430
          },

Что я должен сделать для моего кода синтаксического анализа JSON:

NSDictionary *responseDict = [responseString JSONValue];
    double latitude = [responseDict objectForKey:@"lat"];
    double longitude = [responseDict objectForKey:@"lng"];

Это то, что я пишу, как парсер узнает, имею ли я в виду явное значение lat / lng параметра location или другой?

Ответы [ 3 ]

3 голосов
/ 26 декабря 2011

Чтобы получить правильные значения lat и lon, которые вам нужны, вам нужно получить массив results, затем словарь results, затем словарь geometry, а затем locationсловарь, вот так:

NSDictionary *responseDict = [responseString JSONValue];

// The "results" object is an array that contains a single dictionary: 
// "results": [{...}]
// So first lets get the results array
NSArray *resultsArray = [responseDict objectForKey:@"results"];

// Then get the results dictionary
NSDictionary *resultsDict = [resultsArray objectAtIndex:0];

// Once we have the results dictionary, we can get the geometry
NSDictionary *geometryDict = [resultsDict objectForKey:@"geometry"];

// Then we get the location
NSDictionary *locationDict = [geometryDict objectForKey:@"location"];

// Now we can get the latitude and longitude
double latitude = [locationDict objectForKey:@"lat"];
double longitude = [locationDict objectForKey:@"lng"];
2 голосов
/ 17 ноября 2012

Возможно, нет необходимости упоминать, но ради новичка последние две строки должны быть:

double latitude = [[locationDict objectForKey:@"lat"] doubleValue];
double longitude = [[locationDict objectForKey:@"lng"] doubleValue];
0 голосов
/ 05 января 2017

Эта функция даст ожидаемый результат

- (CLLocationCoordinate2D) geoCodeUsingAddress:(NSString *)address
{
  double latitude = 0, longitude = 0;
  NSString *straddr =  [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  NSString *req = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", straddr];
  NSString *result = [NSString stringWithContentsOfURL:[NSURL URLWithString:req] encoding:NSUTF8StringEncoding error:NULL];
 if (result) 
 {
    NSScanner *scanner = [NSScanner scannerWithString:result];
    if ([scanner scanUpToString:@"\"lat\" :" intoString:nil] && [scanner scanString:@"\"lat\" :" intoString:nil])
    {
        [scanner scanDouble:&latitude];
        if ([scanner scanUpToString:@"\"lng\" :" intoString:nil] && [scanner scanString:@"\"lng\" :" intoString:nil])
        {
            [scanner scanDouble:&longitude];
        }
    }
}
CLLocationCoordinate2D center;
center.latitude = latitude;
center.longitude = longitude;

return center;

}

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...