Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocoa:将json字符串反序列化为自定义对象(不是NSDictionary、NSArray)_Objective C_Cocoa_Cocoa Touch_Json - Fatal编程技术网

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

Objective c Cocoa:将json字符串反序列化为自定义对象(不是NSDictionary、NSArray),objective-c,cocoa,cocoa-touch,json,Objective C,Cocoa,Cocoa Touch,Json,在JavaLand中,有一些有用的库可以将json字符串转换为匹配类型的对象。我在cocoa中看到的json库只是创建嵌套的NSDictionary和NSArray。是否有一个工具可以执行额外的步骤来重建我想要的任何对象类型 例如,如果我有一个名为“Unicorn”的类,其属性为“maneColor”,我有一个json,如下所示: { "maneColor":"silver" } 我可以自动实例化一个Unicorn对象,将“maneColor”设置为“silver”。我不知道有任何具体的实现

在JavaLand中,有一些有用的库可以将json字符串转换为匹配类型的对象。我在cocoa中看到的json库只是创建嵌套的NSDictionary和NSArray。是否有一个工具可以执行额外的步骤来重建我想要的任何对象类型

例如,如果我有一个名为“Unicorn”的类,其属性为“maneColor”,我有一个json,如下所示:

{
 "maneColor":"silver"
}

我可以自动实例化一个Unicorn对象,将“maneColor”设置为“silver”。

我不知道有任何具体的实现,但是键值编码让您非常接近您想要的:。结合KVC,我取得了很好的效果

-setValue:forKey:方法使得将序列化数据适应自定义对象变得相当简单。为了继续您的示例,您需要创建一个Unicorn类,其中包含所有必需的访问器方法:-setName:/-name,-setManeColor/-maneColor,等等。(您可能可以对某些预期值使用属性,但在某些情况下,如maneColor值,您可能需要编写自定义setter,以将颜色名称字符串转换为NSColor或UIColor对象。)

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

当您向Unicorn对象发送-setValue:forKey:时,框架会查找与密钥模式匹配的访问器在设置值时,框架会检查对象是否实现了-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 ];
}
使用Jastor- 将已解析的JSON放入NSDictionary并填充real Objective-C类的实例

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

unicorn.maneColor // "silver"

苹果公司在iOS 5.0中添加了
NSJSONSerialization
类,根据,iOS 5.0具有以下功能:

使用NSJSONSONLISTION类将JSON转换为基础 对象并将基础对象转换为JSON.

可以转换为JSON的对象必须具有以下特性 特性:

顶级对象是NSArray或NSDictionary。所有对象都是 NSString、NSNumber、NSArray、NSDictionary或NSNull的实例。全部 字典键是NSString的实例。数字不是NaN或NaN 无限


以下是一个和,让您开始。

因为
NSObject
的任何子类都符合
NSKeyValueCoding
协议:

NSDictionary *parsedJSON = //whatever
id <NSKeyValueCoding> entity = [[CustomNSObjectSubclass alloc] init];
[entity setValuesForKeysWithDictionary:parsedJSON];
NSDictionary*parsedJSON=//随便什么
id entity=[[CustomNSObjectSubclass alloc]init];
[实体设置值RKEYSWITHDIctionary:parsedJSON];

< /代码>感谢更多的紧张!这肯定是接近我正在寻找的。请注意<代码> NSJSONSurvivation 只使用基础对象。我相信独角兽类不是基础类:)另一种选择是KVCObjectMapping。