2011-04-23 101 views
7

在java-land中,有一些有用的库将JSON字符串转换为匹配类型的对象。我见过的可可的json库只是创建嵌套的NSDictionaries和NSArrays。有没有一种工具可以进行额外的步骤来重构我想要的任何对象类型?Cocoa:将json字符串反序列化为自定义对象(非NSDictionary,NSArray)

因此,举例来说,如果我有一类被称为“麒麟”,具有财产“maneColor”,我有JSON,看起来像这样:

{ 
"maneColor":"silver" 
} 

我能够自动发起与独角兽对象“maneColor”设置为“silver”。

+0

+1独角兽 – psy 2012-05-04 16:32:21

回答

7

我不知道任何特定的实现,但键值编码让你非常接近你想要的:Key Value Coding Guide。我已将streamed json parsing与KVC结合起来,取得了不错的成绩。

-setValue:forKey:方法使序列化数据适应自定义对象非常简单。要继续你的例子,你需要创建一个具有所有必需的访问器方法的Unicorn类:-setName:/ - name,-setManeColor/-maneColor等等(你可以使用某些期望值的属性,但有与maneColor值一样,您可能希望编写自定义setter以从颜色名称字符串转换为NSColor或UIColor对象。)

您还需要将另外两个方法添加到自定义对象:-setValue:forUndefinedKey:和-valueForUndefinedKey :.如果你的对象没有匹配传递给KVC方法的键的访问器方法,那么这些方法将被调用。您可以在这里捕获意外或不支持的值,并根据需要存储或忽略它们。

当您将-setValue:forKey:发送给Unicorn对象时,框架将查找与键模式匹配的访问器。例如,如果键是“maneColor”,并且您正在设置该值,那么框架将检查您的对象是否实现了-setManeColor :.如果是这样,它调用该方法,传入值;否则,调用-setValue:forUndefinedKey:,如果对象没有实现它,则抛出异常。

当解析器的委托收到解析json独角兽对象的通知已经开始时,实例化一个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 ]; 
} 
+0

谢谢你更紧张!这当然接近我正在寻找的东西。 – morgancodes 2011-05-04 17:30:54

7

使用Jastor - https://github.com/elado/jastor 需要已经被解析成JSON NSDictionary的和充满真实Objective-的实例C类。

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

unicorn.maneColor // "silver" 
+0

另一种方法是KVCObjectMapping。 https://github.com/tuyennguyencanada/KVCObjectMapping – occulus 2013-03-25 21:57:49

0

苹果加入NSJSONSerialization类到iOS 5.0,而根据该documentation,执行以下操作:

您使用NSJSONSerialization类JSON转换为基金 对象和转换Foundation对象到JSON 。

可转化为JSON必须具有以下 属性的对象:

顶层对象是一个NSArray或NSDictionary的。所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例 。所有 字典键都是NSString的实例。数字不是NaN或 无限。

这是tutorialwrapper method为您开始。

+1

请注意,“NSJSONSerialization'只能与Foundation对象一起运行。我相信独角兽类不是基础类:) – ULazdins 2012-09-10 12:20:07

1

由于NSObject任何子类符合NSKeyValueCoding协议:

NSDictionary *parsedJSON = //whatever 
id <NSKeyValueCoding> entity = [[CustomNSObjectSubclass alloc] init]; 
[entity setValuesForKeysWithDictionary:parsedJSON]; 
相关问题