Добавить объекты в словарь, созданный JSONKit?
В моем проекте мне нужно загрузить несколько json-файлов. Я разбираю их с JSONKit и после каждого синтаксического анализа
NSMutableDictionary *json = [myJSON objectFromJSONString];
Я добавляю их в массив вроде:
[self.themeArray addObject:json];
Пока это прекрасно. Теперь мне нужно передать словари arround между представлениями. До сих пор работает, но мне нужно добавить еще несколько объектов в объект-словарь -> json. Даже это я объявил json как NSMutableDictionary, он не позволяет мне добавлять объекты, поскольку кажется, что парсер JSONKit создает непеременные словари.
- Как исправить этот строковый формат в iOS?
- Отправка целого числа как json с помощью Restkit
- как я могу разобрать строку ответа xml?
- Objective-C + JSON Parse objectForKey для API Google Адресов
- stringByReplacingOccurrence не заменяет строку
Я думал о создании объекта, который содержит json-словарь и мои дополнительные данные бок о бок, поэтому мне не пришлось бы менять словарь json. Я мог бы даже изменить его на NSDictionary, потому что нет необходимости его менять. Но это кажется мне не очень элегантным.
Вы знаете, как я могу решить эту проблему, не меняя JSONKit lib?
Заранее спасибо!
РЕДАКТИРОВАТЬ
я просто попытался изменить свой код на
NSMutableDictionary *json = [[myJSON objectFromJSONString] mutableCopy];
что-то вроде этого
[[self.theme objectForKey:@"theme"] setObject:sender forKey:@"sender"]; [[self.theme objectForKey:@"theme"] setValue:sender forKey:@"sender"];
Xcode выдает исключение:
* Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: '* – [JKDictionary setObject: forKey:]: метод мутирования, отправленный в неизменяемый объект'
Я предполагаю, что это связано с тем, что в высшем словаре все еще есть вложенные словари. Тогда мне пришлось бы взаимодействовать через мой объект json, чтобы скопировать все словари в изменяемые словари, не так ли?
Возможно, лучше переключиться на NSJSONSerialization, как предложил Гийом.
РЕДАКТИРОВАТЬ
Я просто попробовал что-то вроде этого
[self.theme setValue:sender forKey:@"sender"];
И это работает сейчас! Это было так, как я полагаю. Только объект json был скопирован в изменяемый объект. Наверное, очевидно, для меня это было не для меня.
Спасибо за вашу помощь!
РЕДАКТИРОВАТЬ
Наконец, я снова сменил свой код после того, как мне не удалось изменить все объекты в глубине моих данных словаря на изменяемые объекты. Я выбросил JSONKit и теперь использую NSJSONDeserialization в качестве рекомендации здесь с опцией NSJSONReadingMutableContainers. Теперь мой код выглядит так, и все контейнеры (массивы и словари) тоже изменяются внутри. Это делает меня счастливым! 😉
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:myJSON options:NSJSONReadingMutableContainers error:&jsonParsingError];
- Ошибка анализа IOS JSON
- DDMathParser: как определить значения по умолчанию для переменных
- iOS Parsing JSON и AFNetworking
- Есть ли способ передать PFFile (изображение) другому контроллеру и отобразить его без запроса базы данных в новом контроллере?
- Обнаружение отсутствующих ключей JSON с вложенными объектами
- SCXML-анализ IOS
- Обрабатывать строку или int в ответе JSON
- Как добавить объекты в массив по определенному индексу в блоке завершения асинхронизации с помощью Swift
Вы всегда можете создавать изменяемые версии объектов из своих не изменяемых копий, копируя их.
NSMutableDictionary* json = [[myJSON objectFromJSONString] mutableCopy];
Это не оптимально, но копирование меньших словарей обычно не замечается с точки зрения производительности.
Даже это я объявил json как NSMutableDictionary, он не позволяет мне добавлять объекты, поскольку кажется, что парсер JSONKit создает непеременные словари.
Какой тип объявляется переменной, ничего не значит. Вы могли бы объявить json
как NSNumber
и это не сделало бы NSNumber
.
Вам нужно сделать изменяемую копию словаря (с mutableCopy
), чтобы получить NSMutableDictionary
.
У меня есть три идеи для вас.
- Создайте реальные объекты модели данных и сохраните их в своем массиве. Используйте словарь JSON для инициализации вашего объекта.
- Храните объекты NSMutableDictionary в вашем массиве. Передайте словарь JSON в словарь
+[NSMutableDictionary dictionaryWithDictionary:]
чтобы инициализировать NSMutableDictionary. Другие предложили позвонить-[NSDictionary mutableCopy]
в словаре JSON, чтобы сделать то же самое. - Создайте категорию на основе NSDictionary, в которой хранятся дополнительные данные.
ЗАМЕТКИ:
Обычно создание классов для представления ваших данных считается лучшим вариантом, но это также самый большой объем работы на фронте. В основном вы торгуете больше перед началом работы над большим количеством работ по техническому обслуживанию, поскольку стараетесь поддерживать содержание словарей.
Хранение изменяемого словаря – это именно то, о чем вы, похоже, просите, но может быть много работ, чтобы найти все места, где словари JSON добавляются в массив и заменяя их новым вызовом.
Создание категории для NSDictionary означает, что вам не нужно изменять какой-либо из ваших текущих кодов, но требует, чтобы сопровождающие понимали, как вы улучшили NSDictionary. Кроме того, это поможет разделить ваши изменения с исходным анализируемым JSON. Вы можете использовать связанные объекты для хранения данных.