Лучший способ сделать это - создать объекты, соответствующие структуре JSON. Проще всего было, когда каждый объект JSON становится сущностью, а массивы становятся массивами сущностей. Однако будьте разумны и не вводите слишком много избыточного для подобъектов JSON, которые по существу являются частью его суперобъекта.
Когда вы создали сущности, вы можете начать с разбора и перевода. Используйте некоторую инфраструктуру JSON (начиная с iOS5, там есть Apple) и проанализируйте строку JSON в дереве объектов, где корневым элементом является NSArray или NSDictionary, а подэлементами будут NSArray, NSDictionary, NSNumber, NSString или NSNull.
Перебирайте их один за другим в итерационных циклах и присваивайте соответствующие значения вашим основным атрибутам сущности данных. Вы можете использовать NSKeyValueCoding здесь и избежать слишком большого ручного отображения имен атрибутов. Если ваши атрибуты JSON имеют то же имя, что и атрибуты сущностей, вы сможете просто просмотреть все элементы словаря и разобрать их в атрибуты с тем же именем.
Пример
Мой код синтаксического анализа в аналогичной ситуации был следующим:
NSDictionary *parsedFeed = /* your way to get a dictionary */;
for (NSString *key in parsedFeed) {
id value = [parsedFeed objectForKey:key];
// Don't assign NSNull, it will break assignments to NSString, etc.
if (value && [value isKindOfClass:[NSNull class]])
value = nil;
@try {
[yourCreatedEntity setValue:value forKey:property];
} @catch (NSException *exception) {
// Exception means such attribute is not defined in the class or some other error.
}
}
Этот код будет работать в тривиальной ситуации, однако может потребоваться его расширение в зависимости от ваших потребностей:
- С некоторыми видами пользовательских сопоставлений на случай, если вы хотите, чтобы ваше значение JSON было помещено в атрибут с другим именем.
- Если в вашем JSON есть подобъекты или массивы подобъектов, вам нужно будет обнаружить эти случаи, например, в установщиках, и инициировать новый анализ на один уровень глубже. В противном случае с моим примером вы столкнетесь с ситуацией, когда объект NSDictionary назначается объекту NSManagedObject.
Я не думаю, что было бы разумно углубляться в эти, более сложные вопросы, связанные с этим ответом, поскольку это слишком расширит его.