2012-04-28 9 views
4

一部のjSONは、私のアプリが分解するローカルファイルから来ます:{"1":{"name":"My List","list":[]}}深刻な変更可能なシリアル化されたiOSの辞書/配列

私が原因利用オプションに、私は深い可変辞書であることを前提とするものに全体の事を変換するために、このiOSの5.1のコードを使用します。

私がいることを前提としますオプション NSJSONReadingMutableContainersを考えると
NSData *data = [[NSFileManager defaultManager] contentsAtPath:jSONFile]; 
NSMutableDictionary *mydict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error]; 

子配列listはこのカテゴリに入ります: "NSJSONReadingMutableContainers - 配列と辞書が可変オブジェクトとして作成されることを指定します。" [__ NSArrayIのaddObject:] -

:未認識セレクタに送られ、次の例外を除いて、第二行(のaddObject)に

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

実行爆発:NSJSONSerialization Class Reference、私は、次のコードを実行しようとするからインスタンス0x887e840

**キャッチされない例外により 'NSInvalidArgumentException'、理由にアプリを終了: - 私のSOの研究から

を '[__ NSArrayIのaddObject::]認識されていないセレクタは、インスタンス0x887e840に送られました' (1,2,3)、オブジェクトを追加しようとしている要素(辞書/配列)がでなく、が可変である場合、上記のエラーが一般的に発生するようです。さらに、私のSOの研究(12)から、obj-cでオブジェクトが実際に変更可能かどうかをテストする方法がないように思われます。これは設計によるものです。

私の質問は、どうすれば私のjSON構造が真にシリアル化時(または直後)に「深い」変更可能であることを保証できますか?私はmydictmutableCopyを使用できないことを知っています。その機能は浅いからです。どんな方向/解決策も非常に高く評価されるだろう。ありがとうございました。私は可変深いコピーを行うにはNSDictionaryの上のカテゴリを使用してこの実装を使用して素晴らしい作品ている

答えて

2

:あなたはJSONのシリアル化を解除した後

deep mutable copy of a NSMutableDictionary

をので、あなたはそれに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

かなりいいです。私の辞書は配列を含む辞書を含んでいるので少し修正しなければならなかった。 –

+0

@AuthmanApatira辞書に辞書で動作するコードを投稿できますか?ありがとう! –

関連する問題