4

一部のjSONは、私のアプリが分解するローカルファイルから取得されます:{"1":{"name":"My List","list":[]}}

私はこのiOS5.1コードを使用して、利用されているオプションのために、全体を深い可変辞書であると想定するものに変換します。

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

オプションを指定NSJSONReadingMutableContainersすると、子配列listは次のカテゴリに分類されると思います。「NSJSONReadingMutableContainers-配列と辞書が可変オブジェクトとして作成されることを指定します。」NSJSONSerializationクラスリファレンスからですが、次のコードを実行しようとすると:

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

次の例外を除いて、実行は2行目(addObject)で爆発します。

-[__ NSArrayI addObject:]:認識されないセレクターがインスタンス0x887e840に送信されました

**キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了しています、理由:'-[__ NSArrayI addObject:]:認識されないセレクターがインスタンス0x887e840に送信されました'

私のSOの調査(1、2、3 から、上記のエラーは通常、オブジェクトを追加しようとしている要素(辞書/配列)が変更できない場合に発生するようです。さらに、私のSOの調査(1、2 )から、オブジェクトがobj-cで実際に変更可能であるかどうかをテストする方法はないようです。これは、仕様によるものです

だから私の質問は、私のjSON構造がシリアル化の際(または直後)に実際に「深く」変更可能であることをどのように確認できるかということだと思います。その機能が浅いので使えないmutableCopyのはわかっています。mydict任意の方向性/解決策をいただければ幸いです。ありがとうございました。

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

Appleにはこれに対する解決策がありました:

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

「この呼び出しは、各要素に可変ディクショナリを持つ可変配列を生成します。各ディクショナリの各キーと各値は、それ自体も可変です。」

于 2015-10-08T05:27:00.213 に答える