1

私のプロジェクトでは、いくつかのjsonファイルをロードする必要があります。私はJSONKitでそれらを解析し、すべての解析後に

NSMutableDictionary *json = [myJSON objectFromJSONString]; 

私はそれらを次のような配列に追加します:

[self.themeArray addObject:json];

これは今のところうまく機能します。次に、ビューの間に辞書を渡す必要があります。これまでのところ同様に機能しますが、辞書オブジェクト->jsonにさらにいくつかのオブジェクトを追加する必要があります。jsonをNSMutableDictionaryとして宣言したとしても、JSONKitパーサーが変更不可能な辞書を作成しているように見えるため、オブジェクトを追加できません。

jsonディクショナリと追加のデータを並べて含むオブジェクトを作成することを考えていたので、jsonディクショナリを変更する必要はありません。変更する必要がないので、NSDictionaryに変更することもできます。しかし、それはどういうわけか私にはエレガントではないようです。

JSONKitライブラリを変更せずにこの問題を解決する方法を知っていますか?

前もって感謝します!

編集

コードを次のように変更してみました

NSMutableDictionary *json = [[myJSON objectFromJSONString] mutableCopy];

このようなもの

[[self.theme objectForKey:@"theme"]  setObject:sender forKey:@"sender"];
[[self.theme objectForKey:@"theme"]  setValue:sender forKey:@"sender"];

Xcodeは例外をスローします:

*キャッチされなかった例外'NSInternalInconsistencyException'が原因でアプリを終了しています、理由:'* -[JKDictionary setObject:forKey:]:変更メソッドが不変オブジェクトに送信されました'

上位の辞書にはまだネストされた辞書があるためだと思います。次に、すべての辞書を可変辞書にコピーするために、jsonオブジェクトを介して対話する必要がありますよね?

ギヨームが提案したように、おそらくNSJSONSerializationに切り替える方が良いでしょう。

編集

私はこのようなことを試しました

[self.theme  setValue:sender forKey:@"sender"];

そしてそれは今動作します!思った通りでした。jsonオブジェクトのみが可変オブジェクトにコピーされました。おそらくあなたには明らかですが、それは私にはありませんでした。

よろしくお願いします!

編集

最後に、辞書データの奥深くにあるすべてのオブジェクトを変更可能なオブジェクトに変更できなかったため、コードを再度変更しました。私はJSONKitを破棄し、オプションNSJSONReadingMutableContainersを使用して、ここで推奨としてNSJSONDeserializationを使用します。私のコードはこのようになり、すべてのコンテナー(配列と辞書)も内部で変更可能です。私を幸せにする!;-)

NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:myJSON options:NSJSONReadingMutableContainers error:&jsonParsingError];
4

3 に答える 3

2

オブジェクトをコピーすることで、可変ではないオブジェクトからいつでもオブジェクトの可変バージョンを作成できます。

NSMutableDictionary* json = [[myJSON objectFromJSONString] mutableCopy];

これは最適ではありませんが、パフォーマンスの観点からは、通常、小さい辞書をコピーしても目立ちません。

于 2012-10-16T10:37:27.707 に答える
1

jsonをNSMutableDictionaryとして宣言したとしても、JSONKitパーサーが変更不可能な辞書を作成しているように見えるため、オブジェクトを追加できません。

変数がどのタイプで宣言されているかは、何の意味もありません。jsonあなたはとして宣言することができましNSNumberた、そしてそれはそれをしませんNSNumber

mutableCopyを取得するには、(を使用して)辞書の可変コピーを作成する必要がありNSMutableDictionaryます。

于 2012-10-16T10:40:04.727 に答える
1

私はあなたのために3つのアイデアを持っています。

  1. 実際のデータモデルオブジェクトを作成し、それらを配列に格納します。JSONディクショナリを使用してオブジェクトを初期化します。
  2. NSMutableDictionaryオブジェクトを配列に格納します。JSONディクショナリを+[NSMutableDictionary dictionaryWithDictionary:]に渡して、NSMutableDictionaryを初期化します。-[NSDictionary mutableCopy]同じことをするためにJSON辞書を呼び出すことを提案した人もいます。
  3. 追加データを格納するNSDictionaryに基づいてカテゴリを作成します。

ノート:

一般に、データを表すクラスを作成することが最良のオプションと見なされますが、これは最も多くの先行作業でもあります。基本的に、辞書の保守を続けようとすると、先行作業と保守作業のトレードオフになります。

可変ディクショナリの保存はまさにあなたが求めているように見えますが、JSONディクショナリが配列に追加されているすべての場所を見つけて、それらを新しい呼び出しに置き換えるのは大変な作業になる可能性があります。

NSDictionaryのカテゴリを作成するということは、現在のコードを変更する必要がないことを意味しますが、メンテナはNSDictionaryをどのように拡張したかを理解する必要があります。さらに、元の解析されたJSONから変更を分離するのに役立ちます。関連するオブジェクトを使用してデータを保存できます。

于 2012-10-16T10:42:21.427 に答える