2015-01-22 2 views
0

Учитывая следующие JSON полезной нагрузки я хотел бы извлечь "023" из keyB-> key2:JSON: Понимание формата в Objective-C

JSON Payload:

{ 
    "keyA" : {"lon": 139, "lat" : 35}, 
    "keyB" : [ {"key1" : "value", "key2" : "023"} ] 
} 

Это код, я применяю :

NSDictionary * subResults = jsonResult[@"keyB"]; 
    NSLog(@"VALUE: %@", [subResults valueForKey:@"key2"]) 

Однако значение выводится следующим образом:

VALUE: (
    023 
) 

Я хочу избавиться от скобок "(". Подхожу ли я к добыче неправильно?

+0

что вы имеете в виду? – mm24

+0

Перейдите на json.org и изучите синтаксис JSON. У вас есть «объект», содержащий другой «объект» и «массив». «Массив» в свою очередь содержит «объект». Когда вы использовали 'valueForKey' в массиве, вы сказали:« Дайте мне массив, содержащий все значения, которые соответствуют «key2». Вы получили массив (следовательно, включающие символы '()'), содержащие единственное значение «key2», найденное в исходный массив. –

ответ

3

Во-первых, ваш JSON как данность не действует сын :(у вас есть цитату много. Если мы избегаем его как это:

{"keyA":{"lon":139,"lat":35},"keyB":[{"key1":"value\" clouds","key2":"023"}]} 

Тогда, это нормально Теперь, что у вас здесь есть объект сына, содержащие 2 ключа (A и B) и KEYB связан с JSon массивом значения:..

jsonResult[@"keyB"]; 

Не возвращает NSDictionnary, а NSArray, содержащий 1 NSDictionary. Теперь, если вы пытаетесь получить значение «023», вы должны использовать

NSString str = jsonResult[@"keyB"][0][@"key2"]; // return "023" 

и, возможно,

int twentyThree = str.intValue; 
+0

Хотя было бы лучше (более понятно) не использовать 'valueForKey' в массиве, а вместо этого перебирать массив и использовать' objectForKey' для каждого словаря в массиве. –

+0

код [subResults valueForKey: @ "key2"] работает, потому что это KeyValueCoding, то есть все объекты в коллекции будут выполнять valueForKey: selector, однако результатом является NSArray, следовательно, круглые скобки в журналах –

2

Скобки показывают, что значение находится внутри массива.

NSData strAsData = …; 
NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:strAsData options:0 error:nil]; 
NSArray *subResults = jsonResult[@"keyB"]; 
NSDictionary *subSubResults = subResults[0]; 

NSLog(@"VALUE: %@", subSubResults[@"key2"]); 

Поскольку массив имеет только один элемент, который вы можете использовать вызов -lastObject или -firstObject

+0

Это неправильный результат. 'jsonResults [@" keyB "]' - это массив, а не словарь. – rmaddy

+0

@rmaddy ключ @ "keyB" соответствует '[{" key1 ":" value " cloud "," key2 ":" 023 "}]', это словарь, заключенный в массив (одного элемента). Верно. Не стесняйтесь изменить свое голосование в любое время. – rjstelling

+0

Ваше описание в ваших комментариях правильно. Проблема в том, что ваш код не соответствует описанию. – rmaddy

Смежные вопросы