4

一些 JSON 来自我的应用程序分解的本地文件:{"1":{"name":"My List","list":[]}}.

由于使用了以下选项,我使用此 iOS 5.1 代码将整个内容转换为我认为是深度可变字典的内容:

NSData *data = [[NSFileManager defaultManager] contentsAtPath:jSONFile];
NSMutableDictionary *mydict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error];

给定选项NSJSONReadingMutableContainers,我会假设子数组list属于此类:“NSJSONReadingMutableContainers - 指定数组和字典被创建为可变对象。” 来自NSJSONSerialization Class Reference,但是当我尝试执行以下代码时:

NSMutableArray *myarray = [mydict objectForKey:@"1"] objectForKey:@"list"];
[myarray addObject:@"test"];

执行在第二行(addObject)爆炸,但有以下例外:

-[__NSArrayI addObject:]: 无法识别的选择器发送到实例 0x887e840

** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI addObject:]:无法识别的选择器已发送到实例 0x887e840”

根据我的 SO 研究(123),似乎上述错误通常是在尝试添加对象的元素(字典/数组)不可变时引起的。此外,根据我的 SO 研究(12),似乎没有办法测试对象在 obj-c 中是否确实是可变的,这是设计使然。

所以我想我的问题是,如何确保我的 JSON 结构在序列化时(或之后立即)确实是“深度”可变的?我知道我不能使用mutableCopyonmydict因为那个功能很浅。任何方向/解决方案将不胜感激。谢谢你。

4

2 回答 2

2

我使用了这个实现,它使用 nsdictionary 上的一个类别来做一个可变的深拷贝并且效果很好:

NSMutableDictionary 的深层可变副本

所以在你反序列化 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
于 2012-04-28T17:15:10.523 回答
0

苹果对此有一个解决方案:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/PropertyLists/ReadWritePlistData/ReadWritePlistData.html

“这个调用产生一个可变数组,每个元素中都有可变字典。每个字典中的每个键和每个值本身也是可变的。”

于 2015-10-08T05:27:00.213 回答