У меня есть строка JSON (из PHP, json_encode()
которая выглядит так:
[{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
Я хочу разобрать это в какую-то структуру данных для моего приложения для iPhone. Я думаю, что для меня лучше всего было бы иметь массив словарей, поэтому 0-й элемент в массиве - это словарь с ключами "id" => "1"
и "name" => "Aaa"
.
Я не понимаю, как NSJSONSerialization
хранит данные, хотя. Вот мой код до сих пор:
NSError *e = nil;
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData: data
options: NSJSONReadingMutableContainers
error: &e];
Это просто то, что я видел в качестве примера на другом сайте. Я пытался прочитать JSON
объект, распечатав количество элементов и тому подобное, но всегда получаю EXC_BAD_ACCESS
.
Как мне использовать NSJSONSerialization
парсинг JSON выше и превратить его в структуру данных, о которой я говорил?
ios
objective-c
json
nsdictionary
Логан Серман
источник
источник
Ответы:
Ваш корневой объект json - это не словарь, а массив:
Это может дать вам четкое представление о том, как справиться с этим:
источник
[JSON count]
возвращать что-то вместо того, чтобы просто дать мне EXC_BAD_ACCESS?!jsonArray
и распечатал ошибку. Это должно отобразить любую ошибку, которая произошла во время синтаксического анализа.jsonArray
его, это должно быть авто-релиз.Это мой код для проверки, является ли полученный json массивом или словарем:
Я пробовал это для вариантов: kNilOptions и NSJSONReadingMutableContainers и работает правильно для обоих.
Очевидно, что реальный код не может быть таким, где я создаю указатель NSArray или NSDictionary в блоке if-else.
источник
Меня устраивает. Ваш
data
объект, вероятно,nil
и, как отметил rckoenes, корневой объект должен быть (изменяемым) массивом. Смотрите этот код:(Мне пришлось экранировать кавычки в строке JSON с обратной косой чертой.)
источник
Ваш код выглядит нормально, за исключением результата
NSArray
, а неNSDictionary
, вот пример:Первые две строки просто создают объект данных с JSON, так же, как вы читаете его из сети.
Содержание NSLog (список словарей):
источник
NSJSONReadingMutableLeaves
«Указывает, что листовые строки в графе объектов JSON создаются как экземпляры NSMutableString».NSJSONReadingMutableContainers
:: «Указывает, что массивы и словари создаются как изменяемые объекты».В приведенных выше данных JSON вы показываете, что у нас есть массив, содержащий количество словарей.
Вам нужно использовать этот код для его анализа:
Для быстрой 3/3 +
источник
Следующий код выбирает объект JSON с веб-сервера и анализирует его в NSDictionary. Я использовал API openweathermap, который возвращает простой ответ JSON для этого примера. Для простоты этот код использует синхронные запросы.
источник
@rckoenes уже показал вам, как правильно получать ваши данные из строки JSON.
На вопрос, который вы задали:
EXC_BAD_ACCESS
почти всегда возникает, когда вы пытаетесь получить доступ к объекту после того, как он был [автоматически] освобожден. Это не относится к JSON-де-сериализации, а скорее просто связано с получением объекта и последующим доступом к нему после его освобождения. Факт, что это прибыло через JSON, не имеет значения.Есть много-много страниц, описывающих, как это отладить - вы хотите Google (или SO)
obj-c zombie objects
и, в частностиNSZombieEnabled
, которые окажутся неоценимыми для вас, помогая определить источник ваших объектов-зомби. («Зомби» - это то, что называется, когда вы отпускаете объект, но сохраняете указатель на него и пытаетесь ссылаться на него позже.)источник
Swift 2.0 на Xcode 7 (бета) с блоком do / try / catch:
источник
ПРИМЕЧАНИЕ: для Swift 3 . Ваша строка JSON возвращает массив вместо словаря. Пожалуйста, попробуйте следующее:
источник
источник
Похоже, проблема связана с автоматическим выпуском объектов. NSJSONSerialization JSONObjectWithData, очевидно, создает некоторые автоматически выпущенные объекты и передает их вам. Если вы попытаетесь перенести это в другой поток, он не будет работать, поскольку его нельзя освободить в другом потоке.
Трюк может заключаться в том, чтобы попытаться создать изменяемую копию этого словаря или массива и использовать ее.
Обработка NSDictionary как NSArray не приведет к исключению Bad access, но вместо этого, вероятно, произойдет сбой при вызове метода.
Также, возможно, параметры здесь не имеют большого значения, но лучше дать NSJSONReadingMutableContainers | NSJSONReadingMutableContainers | NSJSONReadingAllowFragments, но даже если они являются автоматически выпущенными объектами, это может не решить эту проблему.
источник
плохой пример, должно быть что-то вроде этого {"id": 1, "имя": "что-то как имя"}
число и строка смешаны.
источник