6

「robotDesign」という名前の次の NSDictionary で「@type」キーの値を取得しようとしています

robotDesign : {
    "@id" = "2";
    "@type" = "piggyDash";
    turnAngle = "-90";
    width = "90.0";
}

これは、私が使用した JSON オブジェクトの一部です

[NSJSONSerialization JSONObjectWithData: options: error:];

次のコードを使用して @type 値を抽出しています

NSString * robot_type = (NSString*)[robotDesign valueForKey:@"@type"];

しかし、次のエラーを受け取ります:

キャッチされていない例外 'NSUnknownKeyException' が原因でアプリを終了しています。

注:「turnAngle」や「width」などのディクショナリ内の他のオブジェクトは、上記と同じコードを使用して簡単に抽出できますが、それぞれのキーを使用することに注意してください。

4

2 に答える 2

13

試す

NSString * robot_type = [robotDesign objectForKey:@"@type"];

または先頭を削除します@

ドキュメントから:

valueForKey:
指定されたキーに関連付けられた値を返します。

- (id)valueForKey:(NSString *)key
パラメータkey 対応する値を返すキー。キーと値のコーディングを使用する場合、キーは文字列でなければならないことに注意してください (「キーと値のコーディングの基礎」を参照)。

戻り値
キーに関連付けられた値。

解説キーが「@」で始まらない場合、objectForKey: を呼び出します。キーが「@」で始まる場合、「@」を取り除き、残りのキーで [super valueForKey:] を呼び出します。

NSDictionary のスーパークラスの実装@を呼び出すことにつながります。valueForKey:しかし、NSObject はキーについて何も知りませんtype

于 2012-11-08T17:46:56.100 に答える
6

これは完全に文書化された動作です。NSDictionaryのクラスリファレンスから:

NSDictionaryは、「valueForKey:」メソッドをオーバーライドします。キーが「@」文字で始まる場合はsuperを呼び出し、そうでない場合はobjectForKeyを呼び出します。

したがって、そうしない正当な理由がない限り、を使用する必要があります- objectForKey:

于 2012-11-08T17:52:14.943 に答える