调用 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
将变成NSArray
的NSDictionary
。因此,要获取字典,我们首先需要从数组中访问它,结果是:
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) 字符串
将 JSON 字符串转换为 NSDictionary 时,并非所有键都有效
我可以从一个键值访问 NSDictionary 中的所有值吗?