调用 NSDictionary 中的所有键包含 JSON 对象时出错

Posted

技术标签:

【中文标题】调用 NSDictionary 中的所有键包含 JSON 对象时出错【英文标题】:Error when calling allKeys on NSDictionary containg JSON objects 【发布时间】:2012-01-16 19:16:53 【问题描述】:

我正在通过 Apple 的示例代码来显示来自这里 http://bit.ly/x4nhG5 的 Twitter 提要

从示例中,代码获取 JSON 并将其放入 NSDictionary:

        NSDictionary *publicTimeline = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonParsingError]; 

此时我只是想做的是查看通过执行此操作返回的所有键:

NSArray *allKeysArray = [publicTimeline allKeys];

然后我在尝试运行程序时收到错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[__NSCFArray allKeys]: 无法识别的选择器发送到实例 0x6a950f0'

从 JSON 加载的这个 NSDictionary 的行为有什么原因?

谢谢, 跳蚤

【问题讨论】:

【参考方案1】:

如果您查看'-[__NSCFArray allKeys] 的异常,这表明您实际上有一个__NSCFArray,它是NSArray 的私有子类。这不是NSDictionary,这就是您得到异常的原因。


如果您查看 JSON 提要,它的格式为

[                             
    
        coordinates: null,
        truncated: false,
        // ...
    ,
    
        coordinates: null,
        truncated: false,
        // ...
    
]                            

在JSON[]代表一个数组,代表一个对象。

[JSON] 数组是值的有序集合

这意味着 JSON 数组可以轻松映射到 NSArray

[JSON] 对象是一组无序的名称/值对

这意味着 JSON 对象可以映射到 NSDictionary


所以查看提要,我们可以看到我们实际上有一个对象数组。其中NSJSONSerialization 将变成NSArrayNSDictionary。因此,要获取字典,我们首先需要从数组中访问它,结果是:

NSDictionary *tweet = [publicTimeline objectAtIndex:0];

NSArray *allKeys    = [tweet allKeys];

【讨论】:

谢谢保罗。 Apple 在他们的代码中将 *publicTimeLine 定义为 NSDictionary。为了使用您的建议;我必须将 *publicTimeLine 声明为 NSArray。通过这样做: NSArray *publicTimeline = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonParsingError];我能够使用你的例子。谢谢! NSDIctionary may not respond to objectAtIndex 出现问题。为什么?。我正在使用 ios 6。【参考方案2】:

错误告诉你的是你的publicTimeline 不是NSDictionary 而是NSArray

所以,我的猜测是,而不是

NSArray *allKeysArray = [publicTimeline allKeys];

这会如你所愿。

NSArray *allKeysArray = [[publicTimeline objectAtIndex:0] allKeys];

【讨论】:

大麦,NSDictionary 不包含 objectAtIndex 的方法。您还有其他建议吗?

以上是关于调用 NSDictionary 中的所有键包含 JSON 对象时出错的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking GET 参数与包含在 URL 键参数中的 JSON (NSDictionary) 字符串

使用具有多个值的键创建 NSDictionary

将 JSON 字符串转换为 NSDictionary 时,并非所有键都有效

我可以从一个键值访问 NSDictionary 中的所有值吗?

如何将所有键和值从 Swift 中的 NSDictionary 获取到单独的字符串数组中?

如何通过键中的子字符串过滤 NSDictionary?