Я удивлен, что на самом деле все работает. Для словарей быстрое перечисление перечисляет клавиши . Вот почему он сообщает, что -objectForKey:
было отправлено на NSCFString
, потому что ключом словаря из JSON всегда является строка.
Вы должны, возможно, сделать это:
for (id d in [tmpDict objectEnumerator])
{
// Objects in a JSON dictionary aren't necessarily dictionaries
if([d isKindOfClass:[NSDictionary class]])
{
tmpID = [[d objectForKey:@"id"] integerValue];
}
}
Одна из возможных причин, по которой он может работать с двумя словарями, заключается в том, что элемент верхнего уровня на самом деле является массивом, а не словарем. Если у вас есть:
[ { "id" : 1 }, { "id" : 2 } ]
ваш анализатор JSON даст вам NSArray
, а не NSDictionary
, который может быть проанализирован вашим кодом, даже если вы предполагаете, что ваш элемент верхнего уровня - словарь.
Редактировать: Увидев ваше обновление, я уверен, что это именно то, что происходит. Если у вас есть один объект, ваша строка JSON выглядит так:
{ "id" : 1, "prop2" : "value1", "prop3" : "value1", "prop4" : "value1" }
Если у вас есть два объекта, он, вероятно, выглядит следующим образом:
[
{ "id" : 1, "prop2" : "value1", "prop3" : "value1", "prop4" : "value1" },
{ "id" : 2, "prop2" : "value1", "prop3" : "value1", "prop4" : "value1" }
]
Обратите внимание на квадратные скобки, что означает массив JSON.