2016-02-12 2 views
0

В моем ответе JSON я получаю словарь, в котором есть массив, внутри этого массива есть словарь с несколькими ключевыми значениями, чтобы было проще понять здесь является ответом JSON:как разбирать словарь внутри массива, который находится в словаре

{ 
    weather = (
      { 
     description = haze; 
     icon = 50n; 
     id = 721; 
     main = Haze; 
     } 
    ); 
    } 

Я хочу знать, как я могу получить описание элементов, значок, идентификатор и основной. Предположим, что у меня есть NSString, называемая str, как я могу добавить значение описания в эту строку. Я пробовал много разных вещей, но никто не работает. Тот, который я думал, должен работать, но это не так:

str = [[[dir valueForKey:@"weather"] objectAtIndex:0] valueForKey:@"description"]; 

Может ли кто-нибудь сообщить мне, как я могу получить доступ к этим 4 значениям. Я не хочу создавать новый массив этих значений, а затем извлекать их. С уважением.

+0

печать str & представление результат. –

+0

Вы пробовали для целей «отладки» фактически выполнять каждый из этих вызовов в отдельной строке, т. Е. Получить словарь, затем первый объект, а затем описание. Я предполагаю, что один из них - это «нуль», это может помочь вам разобраться, в чем проблема. В любом случае, после того, как вы нашли проблему, объедините ее обратно в одну строку. Но вы на самом деле не создаете массив, вы просто ссылаетесь на существующий. – Flexicoder

+2

Кажется, вы делаете правильные вещи. Но все-таки вы это пробовали? [[[dir objectForKey: @ "weather"] objectAtIndex: 0] valueForKey: @ "description"]; – iOSEnthusiatic

ответ

1

Используйте NSJSONSerialization, чтобы преобразовать данные JSON в NSObjects.

Затем вам необходимо указать свои объекты на основе их структуры.

Если структура зафиксирована, и гарантировать, что вы можете сделать это с фиксированными индексами/ключами:

//data in theJSONDict. 

NSArray *outerArray = theJSONDict[@"weather"]; 
NSDictionary *firstWeatherItem = outerArray[0]; 
NSString *firstItemDesc = firstWeatherItem[@"description"]; 

Вы также могли бы сделать все это в 1 строку:

firstItemDesc = theJSONDict[@"weather"][0][@"description"]; 

Но это гораздо сложнее отладить.

Если это данные JSON, поступающие с сервера, вам необходимо запрограммировать более оборонительно, чем указано выше, и написать код, который пытается извлечь ключи из словарей, тесты для nil и либо петли через массив (ы), используя счетчик объектов или проверяет длину массива перед тем, как вслепую индексировать его. В противном случае вы, скорее всего, потерпите крах, если формат ваших входных данных не соответствует вашим предположениям.

(BTW, не используйте valueForKey для этого. То есть KVO код, и в то время как обычно работ, это не то же самое, как с помощью NSArray и NSDictionary методы для получения данных, а иногда не работает правильно.)

+0

Мой наставник указал на то же самое, что, если я попытаюсь установить значение, но он не включен в ответ сервером, я попробовал это, и он получает значение null, поэтому мне все еще нужно проверить, действительно ли значение отправляется сервером или нет? –

+0

Вы спросили: «Мне все еще нужно проверить, отправлено ли какое-либо значение сервером или нет?». Хорошая практика программирования заключается в проверке любых данных, которые отправляются вам из внешнего источника. Так да. –