Как разобрать геолокации JSON из Google для Lng и Lat в Objective-C - PullRequest
2 голосов
/ 20 января 2011

Я создаю веб-запрос для извлечения данных lng и lat на основе zip (используя следующий URL)

http://maps.google.com/maps/geo?q=50266

При этом я получаю следующий json

{
  "name": "50266",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [ {
    "id": "p1",
    "address": "West Des Moines, IA 50266, USA",
    "AddressDetails": {
   "Accuracy" : 5,
   "Country" : {
      "AdministrativeArea" : {
         "AdministrativeAreaName" : "IA",
         "Locality" : {
            "LocalityName" : "West Des Moines",
            "PostalCode" : {
               "PostalCodeNumber" : "50266"
            }
         }
      },
      "CountryName" : "USA",
      "CountryNameCode" : "US"
   }
},
    "ExtendedData": {
      "LatLonBox": {
        "north": 41.6005010,
        "south": 41.5254700,
        "east": -93.7347000,
        "west": -93.8435030
      }
    },
    "Point": {
      "coordinates": [ -93.7353858, 41.5998115, 0 ]
    }
  } ]
}

То, что я пытаюсь извлечь из этого, это просто раздел координат.Вот моя текущая попытка, которая выдает и исключение, когда я нажимаю на последнюю строку, показанную ниже

  //after I get the response I turn it into json and this is working
  NSArray* json = [items JSONValue];

  NSString* coords = [json objectForKey:@"Placemark.Point.coordinates"];

Что мне не хватает здесь для быстрого извлечения координат?

Ответы [ 2 ]

3 голосов
/ 20 января 2011

Общее возвращаемое значение не массив, это словарь. Обратите внимание, что первый символ - {. Если бы это был массив, это было бы [.

NSDictionary * json = [string JSONValue];

Теперь вы хотите, чтобы материал находился под клавишей "Метки". Обратите внимание, что это возвращает массив, так как символ после ключа "Placemarks" (и двоеточия) является [.

NSArray * placemarks = [json objectForKey:@"Placemark"];

Из этого массива вы хотите первый элемент, который является другим NSDictionary:

NSDictionary *firstPlacemark = [placemarks objectAtIndex:0];

Из этого словаря вам нужен словарь под ключом «Точка»:

NSDictionary *point = [firstPlacemark objectForKey:@"Point"];

Из этого словаря вы хотите получить массив под ключом «координаты»:

NSArray * coordinates = [point objectForKey:@"coordinates"];

На данный момент у вас есть массив, который содержит 3 NSNumber объектов. Вуаля!


Для опытных пользователей вы, вероятно, можете использовать кодирование ключ-значение, чтобы добраться до него:

NSArray * coordinates = [json valueForKeyPath:@"Placemark[0].Point.coordinates"];

Хотя я бы не советовал, если вы не понимаете, что там происходит.

Это не работает. Не берите в голову! :)

1 голос
/ 20 января 2011

Имейте в виду, что "[-93.7353858, 41.5998115, 0]" не является строкой

...