3

所以我正在做的事情很简单,从服务器以 JSON 格式获取一些数据。我正在使用 Objective-C 中的默认类(特别是 NSJSONSerialization)将得到的 responseData 转换为 JSON 格式。

所以基本上——

   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”

关于为什么会发生这种情况的任何想法?

我很感激你的帮助,coffeejay

4

5 回答 5

4

似乎[json objectForKey:@"similartracks"]返回一个 NSDictionary,尝试这样的事情:
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,但您正在向方法传递NSJSONSerialization一个名为 的变量responseData

于 2012-10-25T21:57:38.750 回答
0

您的 json 可能不会在 yhat 点返回数组,而是返回字典。显示 json 内容,以便我们进一步提供帮助。

(NsJSonSerialization 返回 id 并且可以是数组或字典。内容再次将是数组或字典)

于 2012-10-25T22:00:06.140 回答
0

您的错误消息说 songList 是字典而不是数组。检查数据结构。

于 2012-10-25T23:51:42.227 回答