Как отобразить объекты JSON в классы Objective C? - PullRequest
6 голосов
/ 21 апреля 2011

Я отображаю данные в формате JSON с веб-сервера на классы Objective C (NSManagedObjects, смоделированные в Xcode, обработанные Core Data). Для каждого атрибута класса Objective C мне нужно:

  1. Определить, существует ли ключ атрибута в объекте JSON,
  2. Определите, не является ли значение для этого ключа нулевым, и
  3. Передать значение в смоделированный экземпляр класса, если выполняются условия 1 и 2

Сейчас я жестко программирую эту последовательность для каждого из атрибутов, поэтому для каждого атрибута необходим код, подобный следующему:

// dictObject is the JSON object converted into a NSDictionary,
// and person is the instance of the modeled class

if ([dictObject objectForKey:@"nameFirst"] &&
    [dictObject objectForKey:@"nameFirst"] != [NSNull null]) {
    person.nameFirst = [dictObject objectForKey:@"nameFirst"];
}

Помимо того, что для обработки различных классов требуется lot кода, это кажется грязным и хрупким: любое изменение имени (или локализация языка) может привести к сбою отображения.

Должен быть лучший способ ... что мне не хватает?

Ответы [ 3 ]

11 голосов
/ 22 апреля 2011

Для обработки значений NULL используйте категорию в NSDictionary.Я использую категорию, которая выглядит так:

NSDictionary + Utility.h

#import <Foundation/Foundation.h>


@interface NSDictionary (Utility) 
- (id)objectForKeyNotNull:(id)key;
@end

NSDictionary + Utility.m

#import "NSDictionary+Utility.h"


@implementation NSDictionary (Utility)

- (id)objectForKeyNotNull:(NSString *)key {
   id object = [self objectForKey:key];
   if ((NSNull *)object == [NSNull null] || (CFNullRef)object == kCFNull)
      return nil;

   return object;
}

@end

Извлечение любых значений из вашего словаря JSON, например:

NSString *stringObject = [jsonDictionary objectForKeyNotNull:@"SomeString"];
NSArray *arrayObject = [jsonDictionary objectForKeyNotNull:@"SomeArray"];
10 голосов
/ 21 апреля 2011

Существует фреймворк RestKit, который позволяет вам делать это. Я не тестировал его, но, похоже, он поддерживается активной компанией и доступен как открытый код: http://restkit.org/

1 голос
/ 19 февраля 2014

В качестве упрощенной альтернативы RestKit, вы можете попробовать GoldenFleece , который преобразует объекты JSON и Objective-C, используя шаблон соглашения о конфигурации, вдохновленный Джексоном .

Отказ от ответственности: я автор.

...