所以我在一个像这样的文件中有一些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:]:此类不是密钥泛码的密钥值编码。'
答案 0 :(得分:2)
在阅读JSON时使用NSJSONReadingMutableContainers。默认情况下,您的容器作为不可变容器读入。
id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:nil];
答案 1 :(得分:0)
修改强>
正确答案:你的结果不可变。
我的错误如下:
在您的示例中,您获得了NSDictionary
,而不是NSJSONSerialization
。
NSJSONSerialization
没有实现解码器。
仅限基本内容:NSString
,NSNumber
,NSArray
,NSDictionary
等
您可以使用NSCoding
也许here类似于您的需求。