【问题标题】:Error parsing Echo Nest API JSON with Objective-C使用 Objective-C 解析 Echo Nest API JSON 时出错
【发布时间】:2014-08-29 15:23:47
【问题描述】:

我对 Objective-C 比较陌生,但我之前用 JavaScript 解析过 JSON。

我的 viewDidLoad 中有这段代码

NSURL *songsURL = [NSURL URLWithString:@"http://developer.echonest.com/api/v4/song/search?api_key=UVHRIOB9ISTKAAQ0R&format=json&results=1&combined=everybody%20dance%20now&bucket=id:7digital-UK&bucket=tracks&limit=true"];

NSData *jsonData = [NSData dataWithContentsOfURL:songsURL];

NSError *error = nil;

NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];

NSDictionary *item = [dataDictionary objectForKey:@"response"];
NSLog(@"%@", item);
NSDictionary *songs = [item objectForKey:@"songs"];
NSLog(@"%@", songs);
NSDictionary *songTitle = [songs objectForKey:@"title"];
NSLog(@"Title= %@", songTitle);

一切正常,直到我尝试获取歌曲名称。

获取歌曲后,JSON 如下所示:

(
    {
    "artist_foreign_ids" =         (
                    {
            catalog = "7digital-UK";
            "foreign_id" = "7digital-UK:artist:2060042";
        }
    );
    "artist_id" = ARKSHFP12D5CD74F5D;
    "artist_name" = "Everybody Left";
    id = SOWGJIF143A016B701;
    title = "We Are Everybody Left";
    tracks =         (
                    {
            catalog = "7digital-UK";
            "foreign_id" = "7digital-UK:track:32612792";
            "foreign_release_id" = "7digital-UK:release:3062491";
            id = TRZNPMZ1429AA0B7CE;
            "preview_url" = "http://previews.7digital.com/clip/32612792";
            "release_image" = "http://artwork-    cdn.7static.com/static/img/sleeveart/00/030/624/0003062491_200.jpg";
        }
    );
 }
)

我尝试使用NSDictionary *tracks = [songs objectForKey:@"tracks"]; 获取其他值,例如tracks,但我仍然收到错误消息:

2014-08-29 01:54:07.612 khord[9530:60b] -[__NSCFArray objectForKey:]: unrecognized selector sent to     instance 0x987c450
2014-08-29 01:54:07.614 khord[9530:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x987c450'

谁能给我一个关于如何正确解析这个 JSON 的解决方案。我感觉我没有正确理解数据类型。

【问题讨论】:

  • FWIW,NSLog 不会以 JSON 格式转储对象,而是以它自己的内部有点易读的格式。
  • @David - NSLog 格式非常接近 JSON 格式,主要区别在于 () 而不是 [] 用于包围数组。其余的差异很容易弄清楚,并且在尝试理解 JSON 时通常并不重要。
  • @HotLicks 同意,但是当发布者说“json 看起来像这样”并发布 NSLog 输出时,肯定有混淆的可能性。

标签: ios objective-c json api


【解决方案1】:

songs 是一个字典数组,每个字典都有一个曲目键。

试试:

[[songs objectAtIndex:0] valueForKey:@"tracks"]

【讨论】:

  • 谢谢,几乎成功了。最初,这引发了一个错误,但 NSString *tracks = [songs valueForKey:@"tracks"]; 是有效的。我发现了valueForKeyPath,然后我现在使用的最终代码是:NSString *previewUrl = [item valueForKeyPath:@"songs.tracks.preview_url"],例如,用于获取 preview_url。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2015-02-15
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多