3

したがって、私がやっていることの要点は単純で、JSON 形式でサーバーからデータを取得することです。取得した responseData を JSON 形式に変換するために、Objective-C (具体的には NSJSONSerialization) の既定のクラスを使用しています。

だから基本的に-

   NSString* testURL=@"http://ws.audioscrobbler.com/2.0/?method=track.getsimilar&artist=Kendrick+Lamar&track=A.D.H.D&api_key=e3f53f2f2896b44ff158a586b8ee15c7&format=json";

   NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:testURL]];

   NSDictionary* json = [NSJSONSerialization
                      JSONObjectWithData:responseData //1
                      options:kNilOptions
                      error:&error];

   NSArray* songList = [json objectForKey:@"similartracks"];

問題は、後でJSOnデータの配列内の個々のオブジェクトにアクセスしようとすると、

   NSDictionary* song1 = [songList objectAtIndex:0];

それは私にこのエラーを与えています、

*キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。理由: '-[__NSCFDictionary objectAtIndex:]: 認識されないセレクターがインスタンス 0x96e2b60 に送信されました'

なぜこれが起こっているのかについてのアイデアはありますか?

助けてくれてありがとう、コーヒージェイ

4

5 に答える 5

4

NSDictionaryを[json objectForKey:@"similartracks"]返すようです。次のようにしてみてください。
NSArray* songList = [[json objectForKey:@"similartracks"] objectForKey:@"track"]

于 2012-10-25T22:10:23.613 に答える
3

そのようなことを扱うときは、何かをしようとする前に常に応答を検証する必要があります。入力を信頼してはいけません。あなたの場合、インスタンスにobjectAtIndex:メッセージを送信しようとしていNSDictionaryます。これにより、認識されないセレクター例外が発生します。

このようなクラッシュを回避する簡単な方法は、返されたオブジェクトのクラスを確認することです。次に例を示します。

id song1 = json[@"similartracks"]
if([song1 isKindOfClass:[NSArray class]])
{
    //Now we're sure it's an array
}
于 2012-10-25T22:21:36.400 に答える
0

返されたデータをであると宣言していますが、メソッドに。という変数dataを渡しています。NSJSONSerializationresponseData

于 2012-10-25T21:57:38.750 に答える
0

あなたのエラー メッセージは、songList が配列ではなく辞書であることを示しています。データ構造を確認してください。

于 2012-10-25T23:51:42.227 に答える
0

あなたのjsonはおそらくyhat時点では配列を返さず、辞書を返します。さらに支援できるように、json コンテンツを表示します。

(NsJSonSerialization は id を返し、配列または辞書のいずれかになります。内容は配列または辞書になります)

于 2012-10-25T22:00:06.140 に答える