Ios 深度可变字典/数组

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

一些jSON来自我的应用程序分解的本地文件:
{“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您能在字典中发布与字典一起使用的代码吗?谢谢