Cocoa:将json字符串反序列化为自定义对象(不是NSDictionary,NSArray)

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对象.

mor*_*ion 7

我不知道任何具体的实现,但键值编码可以让您非常接近您想要的:键值编码指南.结合流式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)


ela*_*ado 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"
Run Code Online (Sandbox Code Playgroud)