mor*_*des 7 cocoa cocoa-touch json objective-c
在java-land中,有一些有用的库可以将json字符串转换为匹配类型的对象.我见过的可可的json库只是创建了嵌套的NSDictionaries和NSArrays.是否有一个工具可以重新构建我想要的任何对象类型?
所以,例如,如果我有一个名为"Unicorn"的类,其属性为"maneColor",我的json看起来像这样:
{
"maneColor":"silver"
}
Run Code Online (Sandbox Code Playgroud)
我可以自动实例化"maneColor"设置为"silver"的Unicorn对象.
我不知道任何具体的实现,但键值编码可以让您非常接近您想要的:键值编码指南.结合流式json解析和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对象的通知时,实例化一个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 ];
}
Run Code Online (Sandbox Code Playgroud)
使用Jastor - https://github.com/elado/jastor将 已经解析的JSON解析为NSDictionary并填充真实Objective-C类的实例.
NSDictionary *parsedJSON = (yajl, JSONKit etc)
Unicorn *unicorn = [[Unicorn alloc] initWithDictionary:parsedJSON];
unicorn.maneColor // "silver"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3887 次 |
| 最近记录: |