Пытаться разобрать массив json, возвращенный успокаивающим веб-APS для проекта iOS

Я пытаюсь проанализировать массив JSON, возвращенный веб-интерфейсом RESTful, который похож на следующий (используя jsonviewer, json возвращается как куча словарей в массиве):

[{ "date": "2011-03-21", "meal": "BREAKFAST", "category": "BREAKFAST BAKERY", "recipe": "213012", "name": "Aesops Bagels", "portion": "1", "unit": "each"}, 

Я пытаюсь получить информацию о «имени», а затем сохранить его в виде таблицы. Вот код, который я использую для этого:

 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSArray *allDataArray = [NSJSONSerialization JSONObjectWithData:webData options:0 error:nil]; for (NSDictionary *diction in allDataArray) { NSDictionary *menuItem = [diction objectForKey:@"menuItem"]; NSString *name = [menuItem objectForKey:@"name"]; [array addObject:name]; } [[self MyTableView]reloadData]; } 

Ошибка, которую я получаю:

Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «*** – [__ NSArrayM insertObject: atIndex:]: объект не может быть nil '

Поэтому я уверен, что в строке выше цикла for произошла ошибка, и это приводит к тому, что массив пытается использовать nil в качестве значения. Но любая помощь в выяснении того, что происходит неправильно / как успешно разобрать этот json, будет чрезвычайно оценена. Я очень новичок в json, xcode и iOS, поэтому прошу прощения, если я сделал что-то особенно глупое.

2 Solutions collect form web for “Пытаться разобрать массив json, возвращенный успокаивающим веб-APS для проекта iOS”

У вас фактически нет элемента, называемого menuItem в вашем примере JSON. Ваш код выглядит так, как было написано для разбора JSON, который выглядит так:

 [{ "menuItem" : { "name" : "Aesops Bagels", … } }, ] 

т. е. ожидание клавиши «menuItem» в каждом словаре в списке. Если вы на самом деле пытаетесь разобрать фрагмент, который вы опубликовали, я думаю, вам просто нужно упростить код цикла из этого:

 NSDictionary *menuItem = [diction objectForKey:@"menuItem"]; NSString *name = [menuItem objectForKey:@"name"]; 

чтобы:

 NSString *name = [diction objectForKey:@"name"]; 

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

Как сказал ckhan, ваш объект JSON – это всего лишь набор словарей, без каких-либо ссылок на «menuitem». Если на самом деле у вас нет элемента «menuitem» в вашем объекте JSON (т. Е. Предполагая, что JSON, предоставленный в вашем вопросе, является репрезентативным), тогда это будет просто:

 for (NSDictionary *diction in allDataArray) [array addObject:[diction objectForKey:@"name"]]; 

Или

 [allDataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [array addObject:obj[@"name"]]; }]; 

Или, проще говоря, сделайте array неизменным NSArray а не NSMutableArray и используйте следующее:

 NSArray *array = [allDataArray valueForKey:@"name"]; 

Кстати, если вы действительно обеспокоены тем, что некоторые словаря могут не иметь записи «name», в то время как одна строка valueForKey обрабатывает это, остальные должны добавить условную логику, например:

 for (NSDictionary *diction in allDataArray) { id value = diction[@"name"]; if (value == nil) value = [NSNull null]; [array addObject:value]; }; 

Очевидно, я добавляю NSNull в массив, чтобы вы знали, что есть запись словаря, для которой не было имени. Как вы хотите справиться с этим сценарием (например, добавить NSNull, просто добавить ничего и т. Д.) Зависит от вас, но, надеюсь, это дает вам идею. Но я думаю, что главной проблемой была ссылка «menuitem», поэтому это может быть спорным.

  • Удаление html-тегов и нежелательных символов в iOS
  • Инструмент командной строки Apple для проверки файла ipa перед отправкой в ​​AppStore
  • SDK Google Maps для iOS требует, чтобы GoogleMaps.bundle был частью вашей цели в разделе «Ресурсы копирования Bundle»
  • Как я могу добавить одно и то же фоновое изображение ко всем представлениям в моем приложении ios с помощью swift?
  • ErrorCode: AccessDenied, Message: для аутентификации AWS требуется действительный заголовок Date или x-amz-date
  • написать NSString в файл
  • как добавить в медиа-библиотеку в xcode?
  • Использование xcodebuild с проектом iOS и iOS Simulator
  • Ошибка компилятора Swift: «Слишком сложное выражение» при конкатенации строк
  • Ошибка Xcode 4: ошибка при запуске исполняемого файла
  • Swift 2.0 Сегодня проблемы с расширением
  • Interesting Posts

    UISplitViewController + Split View: скрыть сведения при запуске

    Высота строки состояния в Swift

    почему я не могу зарегистрировать свое устройство для push-сообщений Apple после отмены регистрации?

    Получение видимого значения UIView

    Как вызвать функцию performSelectorInBackground с функцией с аргументами?

    Что на самом деле происходит, когда в Firebase включено сохранение?

    MonoTouch: Как добавить распознаватель жестов двух пальцев в UIPageViewController?

    Как сбрасывать данные о брелках симулятора iPhone

    Комплект Sprite – Пружинные шарниры (амортизатор)

    Несколько UICollectionViews прокручивают по горизонтали, как iBooks

    Остановка CAKeyframeAnimation в середине

    Ячейки UITableview не отображаются до тех пор, пока вы не прокрутите

    Проблема с песочницей приложения App Purchase

    Экспорт данных в файл * .xls с помощью xml для создания файла в приложении iOS 5

    Получение фактического NSString для AvCaptureVideoDataOutput availableVideoCVPixelFormatTypes

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.