Ios 深度可变字典/数组
一些jSON来自我的应用程序分解的本地文件:Ios 深度可变字典/数组,ios,json,ios5,nsmutablearray,Ios,Json,Ios5,Nsmutablearray,一些jSON来自我的应用程序分解的本地文件:{“1”:{“name”:“我的列表”,“列表”:[]} 由于使用了以下选项,我使用iOS 5.1代码将整个内容转换为一个深度可变字典: NSData *data = [[NSFileManager defaultManager] contentsAtPath:jSONFile]; NSMutableDictionary *mydict = [NSJSONSerialization JSONObjectWithData:data options:NSJ
{“1”:{“name”:“我的列表”,“列表”:[]}
由于使用了以下选项,我使用iOS 5.1代码将整个内容转换为一个深度可变字典:
NSData *data = [[NSFileManager defaultManager] contentsAtPath:jSONFile];
NSMutableDictionary *mydict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error];
给定选项NSJSONReadingMutableContainers
我假设子数组list
将属于此类:“NSJSONReadingMutableContainers-指定将数组和字典创建为可变对象。”从,但当我尝试执行以下代码时:
NSMutableArray *myarray = [mydict objectForKey:@"1"] objectForKey:@"list"];
[myarray addObject:@"test"];
执行在第二行(addObject)上爆炸,但出现以下异常:
-[\uuu NSArrayI addObject:]:发送到实例0x887e840的选择器无法识别
**由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[\uu NSArrayI addObject:]:无法识别的选择器已发送到实例0x887e840”
根据我的SO研究(,),似乎上述错误通常是在对象试图添加到的元素(字典/数组)不可变时引起的。此外,根据我的SO研究(,),似乎没有办法测试对象在obj-c中是否确实是可变的,这是通过设计实现的
所以我想我的问题是,如何确保我的jSON结构在序列化之后(或之后)确实是“深层”可变的?我知道我不能在
mydict
上使用mutableCopy
,因为该函数很浅。如有任何指导/解决方案,将不胜感激。谢谢。我使用了这个实现,它使用nsdictionary上的一个类别来进行可变深度复制,效果非常好:
因此,在对json进行反序列化之后,可以对其调用mutableDeepCopy
这就是我所拥有的:
@interface NSDictionary(Category)
- (NSMutableDictionary *)mutableDeepCopy;
@end
@implementation NSDictionary(Category)
- (NSMutableDictionary *)mutableDeepCopy{
NSMutableDictionary * ret = [[NSMutableDictionary alloc]
initWithCapacity:[self count]];
NSMutableArray * array;
for (NSString* key in [self allKeys]){
if([[self objectForKey:key] respondsToSelector:@selector(mutableCopyWithZone:)]){
array = [(NSArray *)[self objectForKey:key] mutableCopy];
[ret setValue:array forKey:key];
}
else{
[ret setValue:[self objectForKey:key] forKey:key];
}
}
return ret;
}
@end
苹果有一个解决方案:
“此调用生成一个可变数组,每个元素中都有可变字典。每个字典中的每个键和每个值本身也是可变的。”相当不错。因为我的字典包含包含数组的字典,所以我不得不做一些修改。@AuthmanApatira您能在字典中发布与字典一起使用的代码吗?谢谢