如何将JSON对象映射到Objective C类?

时间:2011-04-21 03:10:17

标签: objective-c json serialization deserialization

我正在将来自Web服务器的JSON格式数据映射到Objective C类(在Xcode中建模的NSManagedObjects,由Core Data处理)。对于Objective C类的每个属性,我需要:

  1. 确定属性的密钥是否存在于JSON对象中,
  2. 确定该键的值是否为空,
  3. 如果条件1和2为真,则将值传递给建模的类实例
  4. 现在,我正在为每个属性对此序列进行硬编码,因此每个属性都需要如下代码:

    // 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 个答案:

答案 0 :(得分:11)

要处理 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"];

答案 1 :(得分:10)

有一个名为RestKit的框架可以让你做到这一点。我没有对它进行过测试,但它似乎得到了一个活跃的公司的支持,并作为开源提供:http://restkit.org/

答案 2 :(得分:1)

作为RestKit的轻量级替代品,您可以尝试GoldenFleece,它使用受Jackson启发的约会配置模式在JSON和Objective-C对象之间进行转换。

免责声明:我是作者。