0

iPhone開発の質問(ObjectiveC)。

TouchJSONライブラリを使用しようとしていますが、JSONへのシリアル化に問題があります。ARCをオンにしているので、githubのARCブランチを使用しています。 私は、かなり基本的なネストされた構造であると私が想像するものを試しています。辞書内の3つの辞書と辞書内の配列。

//Make some dictionaries with simple string pairs
NSDictionary *dicA = [NSDictionary dictionaryWithObjectsAndKeys:@"x", @"1", @"y", @"2", nil];
NSDictionary *dicB = [NSDictionary dictionaryWithObjectsAndKeys:@"x", @"1", @"y", @"2", nil];
NSDictionary *dicC = [NSDictionary dictionaryWithObjectsAndKeys:@"x", @"1", @"y", @"2", nil];

//Make an array of dictionary objects
NSArray *saveArray = [NSArray arrayWithObjects:dicA, dicB, dicC, nil];

//Make dictionary which has that array as one of the values
NSDictionary *bigDic = [NSDictionary dictionaryWithObjectsAndKeys:@"arr", saveArray,
                                                                  @"mmm", @"nnn", nil];

NSData *jsonData = [[CJSONSerializer serializer] serializeObject:saveArray error:NULL];
//This works '[{"1":"x","2":"y"},{"1":"x","2":"y"},{"1":"x","2":"y"}]'

NSData *jsonDataB = [[CJSONSerializer serializer] serializeObject:bigDic error:NULL];
//This fails

bigDicをシリアル化しようとすると、実行時に次のように爆破されます。

'NSInvalidArgumentException'、理由:'-[__ NSArrayI UTF8String]:認識されないセレクターがインスタンスに送信されました

上記の行で配列をシリアル化すると、問題なく機能するようです。私のbigDicの何が問題になっていますか?

4

1 に答える 1

0

この質問を注意深く書いた後、私はどこが間違っていたかに気づきました。とにかくこれを投稿すると思いました。多分それは他の人にとって役立つ例です。だから答えは...

辞書を後ろから前に持っています!

dictionaryWithObjectsAndKeysメソッドは、値とキーを逆に予期するため、この構造を構築する正しい方法は次のとおりです。

//Make some dictionaries with simple string pairs
NSDictionary *dicA = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"x", @"2", @"y", nil];
NSDictionary *dicB = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"x", @"2", @"y", nil];
NSDictionary *dicC = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"x", @"2", @"y", nil];

//Make an array of dictionary objects
NSArray *saveArray = [NSArray arrayWithObjects:dicA, dicB, dicC, nil];

//Make dictionary which has that array as one of the values
NSDictionary *bigDic = [NSDictionary dictionaryWithObjectsAndKeys:saveArray, @"arr",
                                                                  @"nnn", @"mmm", nil];

これは、メソッド名「dictionaryWithObjectsAndKeys」を見ると理にかなっていますが、なぜ「dictionaryWithKeysAndObjects」として実行されないのかわかりません。

于 2011-12-18T13:21:12.693 に答える