所以我正在做的事情很简单,从JSON格式的服务器获取一些数据。我正在使用Objective-C中的默认类(特别是NSJSONSerialization)将responseData getten转换为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
答案 0 :(得分:4)
似乎[json objectForKey:@"similartracks"]
返回NSDictionary,尝试这样的事情:
NSArray* songList = [[json objectForKey:@"similartracks"] objectForKey:@"track"]
答案 1 :(得分:3)
在处理此类事情时,您应该始终在尝试使用它之前验证您的响应,您永远不应该相信任何输入。在您的情况下,您尝试向objectAtIndex:
实例发送NSDictionary
消息,这会引发无法识别的选择器异常。
避免此类崩溃的一种简单方法是检查返回对象的类,例如:
id song1 = json[@"similartracks"]
if([song1 isKindOfClass:[NSArray class]])
{
//Now we're sure it's an array
}
答案 2 :(得分:0)
您声明返回的数据为data
,但您正在将NSJSONSerialization
方法传递给名为responseData
的变量。
答案 3 :(得分:0)
你的json可能不会在yhat点返回一个数组,而是一个字典。显示json内容,以便我们进一步提供帮助。
(NsJSonSerialization返回id,可以是数组或字典。内容也将是数组或字典)
答案 4 :(得分:0)
您的错误消息显示songList是字典而不是数组。检查数据结构。