Получение objectForKey: в NSDictionary с данными JSON, возвращающими ноль, даже если ключ присутствует - PullRequest
0 голосов
/ 24 февраля 2012

Я создаю приложение для iPhone, в котором извлекаю данные JSON из http://maps.googleapis.com/maps/api/geocode/json?address=canada&sensor=true,, а затем сохраняю их в объекте NSDictionary.Мой код компилируется нормально, и данные JSON действительны.Однако, когда я ищу определенные ключи, он возвращает ноль, даже если ключ присутствует, и я не делаю опечатку.Это единственный работающий ключ (feed - это объект NSDictionary):

NSString *status = [[NSString alloc] initWithFormat:[feed objectForKey:@"status"]];

, но когда я делаю что-то вроде этого:

NSString *longName = [[NSString alloc] initWithFormat:[feed objectForKey:@"long_name"]];

Я получаю эту ошибку:

WebKit отбросил необработанное исключение в webView: shouldInsertText: replaceDOMRange: GivenAction: Delegate: * - [NSPlaceholderString initWithFormat: locale: arguments:]: аргумент nil

У меня два вопроса: как я могу это исправить?Кроме того, поскольку этот геокодер Google может возвращать несколько мест, если существует несколько мест с одинаковым именем (например, «Спрингфилд»), как я могу выбрать, к какому ключу я хочу обратиться?(например, какое "длинное_имя", какое "лат" и т. д.)

Заранее спасибо!

1 Ответ

6 голосов
/ 24 февраля 2012

Причина, по которой «статус» работает, заключается в том, что он находится в корне вашего словаря, тогда как длинное имя и большинство других частей находятся в под-словарях внутри под-массивов. Попробуйте что-то вроде этого:

NSArray *results = [feed objectForKey:@"results"];
NSDictionary *firstResult = [results objectAtIndex:0];
NSArray *addressComponents = [firstResult objectForKey:@"address_components"];
NSDictionary *firstAddress = [addressComponents objectAtIndex:0];
NSString *longName = [firstAddress objectForKey:@"long_name"];

Если вы хотите, чтобы все значения были услышаны, вам, конечно, нужно будет настроить циклы. В приведенном мной примере показано, как получить длинное имя по первому адресу в пределах первого возвращенного результата.

...