【问题标题】:How to successfully convert JSON data to Objective-C objects?如何成功地将 JSON 数据转换为 Objective-C 对象?
【发布时间】:2012-10-25 21:53:25
【问题描述】:

所以我正在做的事情很简单,从服务器获取一些 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”

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

感谢您的帮助, 咖啡豆

【问题讨论】:

  • 一件简单的事情是在创建json 变量后立即对其进行NSLog。 NSLog 将打印出与原始 JSON 非常相似的表示形式(尽管使用 () 字符而不是 {},如果我没记错的话),所以你可以看到你有什么。然后在“剥离”数据的每一步之后再次使用 NSLog。 (当然,您会在最终代码中删除 NSLog,并添加 isKindOfClass 检查。)

标签: iphone objective-c ios xcode json


【解决方案1】:

[json objectForKey:@"similartracks"] 似乎返回了一个 NSDictionary,试试这样:
NSArray* songList = [[json objectForKey:@"similartracks"] objectForKey:@"track"]

【讨论】:

  • 这是一种不好的方法,可能会导致更多的崩溃。你怎么知道关键的“similartracks”包含一个NSDictionary 实例?添加健全性检查。
【解决方案2】:

在处理此类事情时,您应该始终在尝试对它做某事之前验证您的响应,您永远不应该相信任何输入。在您的情况下,您尝试将 objectAtIndex: 消息发送到 NSDictionary 实例,这会引发无法识别的选择器异常。

避免此类崩溃的一个简单方法是检查返回对象的类,例如:

id song1 = json[@"similartracks"]
if([song1 isKindOfClass:[NSArray class]])
{
    //Now we're sure it's an array
}

【讨论】:

  • 检查以确保您返回的是良好的编程风格。
【解决方案3】:

您将返回的数据声明为data,但您正在向NSJSONSerialization 方法传递一个名为responseData 的变量。

【讨论】:

    【解决方案4】:

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

    (NsJSonSerialization 返回 id,可以是数组或字典。内容还是数组或字典)

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2011-11-27
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-14
        相关资源
        最近更新 更多