Какао: десериализация строки json для пользовательских объектов (не NSDictionary, NSArray) - PullRequest
7 голосов
/ 23 апреля 2011

В java-land есть несколько полезных библиотек, которые преобразуют строки json в объекты соответствующего типа.Библиотеки json, которые я видел для какао, просто создают вложенные NSDictionaries и NSArrays.Существует ли какой-либо инструмент, который позволит выполнить дополнительный этап восстановления любого типа объекта, который я хочу?

Так, например, если у меня есть класс "Unicorn" со свойством "maneColor", и у меня есть json, который выглядит следующим образом:

{
 "maneColor":"silver"
}

Я могу автоматически создать экземпляробъект Unicorn с параметром "maneColor", установленным на "silver".

Ответы [ 4 ]

7 голосов
/ 01 января 2012

Используйте Jastor - https://github.com/elado/jastor Принимает уже проанализированный JSON в NSDictionary и заполняет экземпляр реального класса Objective-C.

NSDictionary *parsedJSON = (yajl, JSONKit etc)
Unicorn *unicorn = [[Unicorn alloc] initWithDictionary:parsedJSON];

unicorn.maneColor // "silver"
7 голосов
/ 27 апреля 2011

Я не знаю каких-либо конкретных реализаций, но кодирование значения ключа приближает вас к тому, что вы хотите: Руководство по кодированию значения ключа . Я добился хороших результатов, сочетая потоковый анализ JSON с KVC.

Метод -setValue: forKey: делает адаптацию сериализованных данных к пользовательским объектам довольно простой. Чтобы продолжить работу с примером, вы должны создать класс Unicorn со всеми необходимыми методами доступа: -setName: / - name, -setManeColor / -maneColor и т. Д. (Вы можете использовать свойства для некоторых ожидаемых значений, но есть случаи, как со значением maneColor, когда вы, вероятно, захотите написать собственный установщик для преобразования из строки имени цвета в объект NSColor или UIColor.)

Вы также захотите добавить еще два метода в свой пользовательский объект: -setValue: forUndefinedKey: и -valueForUndefinedKey :. Это методы, которые будут вызываться, если у вашего объекта нет методов доступа, соответствующих ключу, переданному в методы KVC. Здесь вы можете перехватывать неожиданные или неподдерживаемые значения и сохранять их или игнорировать их при необходимости.

Когда вы отправляете -setValue: forKey: объекту Unicorn, каркас ищет средства доступа, соответствующие шаблону ключа. Например, если ключ «maneColor» и вы устанавливаете значение, платформа проверяет, реализует ли ваш объект -setManeColor :. Если это так, он вызывает этот метод, передавая значение; в противном случае -setValue: forUndefinedKey: вызывается, и если ваш объект не реализует его, генерируется исключение.

Когда делегат вашего синтаксического анализатора получает уведомление о том, что анализ объекта jic unicorn начался, создать экземпляр объекта Unicorn. Когда ваш парсер возвращает вам проанализированные данные, используйте -setValue: forKey: чтобы добавить данные в ваш объект:

- ( void )parserDidBeginParsingDictionary: (SomeParser *)p
{
     self.currentUnicorn = [ Unicorn unicorn ];
}

- ( void )parser: (SomeParser *)p didParseString: (NSString *)string
          forKey: (NSString *)key
{
    [ self.currentUnicorn setValue: string forKey: key ]
}

- ( void )parserDidFinishParsingDictionary: (SomeParser *)p
{
    [ self.unicorns addObject: self.currentUnicorn ];
}
1 голос
/ 15 сентября 2013

Поскольку любой подкласс NSObject соответствует протоколу NSKeyValueCoding:

NSDictionary *parsedJSON = //whatever
id <NSKeyValueCoding> entity = [[CustomNSObjectSubclass alloc] init];
[entity setValuesForKeysWithDictionary:parsedJSON];
0 голосов
/ 01 августа 2012

Apple добавила класс NSJSONSerialization в iOS 5.0, который, согласно документации , выполняет следующие действия:

Вы используете класс NSJSONSerialization для преобразования JSON в объекты Foundation.и преобразовать объекты Foundation в JSON.

Объект, который может быть преобразован в JSON, должен иметь следующие свойства:

Объектом верхнего уровня является NSArray или NSDictionary.Все объекты являются экземплярами NSString, NSNumber, NSArray, NSDictionary или NSNull.Все ключи словаря являются экземплярами NSString.Числа не являются NaN или бесконечностью.

Вот учебник и метод оболочки , чтобы начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...