2011-04-21 100 views
6

我将JSON格式的数据从Web服务器映射到Objective C类(由Core Data处理的Xcode中建模的NSManagedObjects)。对于目标C类的每个属性,我需要:如何将JSON对象映射到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"]; 
} 

而且需要的代码很多处理各种类,这似乎缺憾而脆:任何名称变更(或语言本地化)会导致映射失败。

必须有更好的办法......我错过了什么?

回答

10

有一个名为RestKit的框架,可以让你做到这一点。我没有测试它,但它似乎是通过积极的公司,并支持可作为开源:http://restkit.org/

+0

谢谢pokstad-之前没有看到过。我下载了RestKit并一直在玩它...它为应用程序增加了大量的大小 - 36MB的源文件夹 - 但可能是值得的。如果我使用它,肯定会接受你的答案。 (我仍然希望有人会回复更“原生”的方法。) – Dan 2011-04-22 14:48:11

+0

没问题。不清楚你的意思是什么。该ReskKit是专门为基于可可的应用程序。此外,源代码的大小几乎总是大于二进制大小,因此就编译二进制大小而言,我不担心36MB。 – pokstad 2011-04-22 23:45:00

+0

公平的 - RestKit看起来像一个很好的解决方案,但是如果我实现它,我将学习如何实现RestKit,而不是学习更好的Obj-C技巧:)(尽管当然可以争辩说学习实现框架很好_is_学习Obj-C更好。) – Dan 2011-04-23 00:01:06

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字典这样的检索的任何值:

+0

谢谢沃尔夫冈 - 这实际上很有帮助。我会接受pokstad的答案,因为它更健壮,但我肯定也会使用这种模式。 – Dan 2011-04-26 03:40:05

1

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

声明:我是作者。

+0

如果您正在推送自己的图书馆,则应该添加一项披露 – 2016-11-10 19:37:12