2012-04-28 42 views
4

一些jSON來自我的應用分解的本地文件:{"1":{"name":"My List","list":[]}}深度可變的seralizing iOS字典/數組

我用這個的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 (1,2,3),似乎上述錯誤通常是由於嘗試將對象添加到的元素(字典/數組)爲而非可變。此外,從我的SO研究(1,2)看來,似乎沒有辦法測試一個對象是否確實可以在obj-c中進行修改,並且這是通過設計。

所以我想我的問題是,我怎樣才能確保我的jSON結構確實是'深'可變的(或之後)序列化?我知道我不能在mydict上使用mutableCopy,因爲這個功能很淺。任何方向/解決方案將不勝感激。謝謝。

回答

2

我用它使用類別上的NSDictionary此實現做一個可變深拷貝和偉大工程:

deep mutable copy of a 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 
+0

非常好。由於我的字典包含包含數組的字典,因此我必須修改一下。 – 2012-04-28 18:31:27

+0

@AuthmanApatira你可以發佈你的代碼,在字典中的字典工作嗎?謝謝! – 2013-10-14 15:42:43