键值编码失败

时间:2015-03-24 15:35:13

标签: ios objective-c key-value-coding

所以我在一个像这样的文件中有一些json

{
"address": {
    "home": {
        "street": "A Street"
    }
}

}

我像这样拉出json字符串

NSString *string = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

我想使用键路径动态更改值,因此我需要制作一个深度可变的结构副本。所以我这样做是

id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
data = [NSKeyedArchiver archivedDataWithRootObject:json];
json = [NSKeyedUnarchiver unarchiveObjectWithData:data];

使用断点我可以看到json,它看起来都很好。但是,我在这一行上遇到了崩溃

[json setValue:@"Different Street" forKeyPath:@"address.home.street"];

编译器建议此密钥路径上没有符合键值编码的密钥。

令人讨厌的是,这行正常工作并返回街道字符串

id value = [json valueForKeyPath:@"address.home.street"];

为什么我不能设置这样的值?


由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[< __ NSDictionaryI 0x1741bb580> setValue:forUndefinedKey:]:此类不是密钥泛码的密钥值编码。'

2 个答案:

答案 0 :(得分:2)

在阅读JSON时使用NSJSONReadingMutableContainers。默认情况下,您的容器作为不可变容器读入。

id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:nil];

答案 1 :(得分:0)

修改

正确答案:你的结果不可变。

我的错误如下:

在您的示例中,您获得了NSDictionary,而不是NSJSONSerialization

NSJSONSerialization没有实现解码器。

仅限基本内容:NSStringNSNumberNSArrayNSDictionary

您可以使用NSCoding

编写自己的代码

也许here类似于您的需求。