如何成功将JSON数据转换为Objective-C对象?

时间:2012-10-25 21:53:25

标签: iphone objective-c ios xcode json

所以我正在做的事情很简单,从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

5 个答案:

答案 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是字典而不是数组。检查数据结构。