我正在使用Apple的示例代码来显示来自此处的http://bit.ly/x4nhG5
的Twitter Feed从示例中,代码采用JSON并将其放入NSDictionary:
NSDictionary *publicTimeline = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonParsingError];
此时我刚想做的就是查看通过执行此操作返回的所有键:
NSArray *allKeysArray = [publicTimeline allKeys];
然后我在尝试运行程序时收到错误:
由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:' - [__ NSCFArray allKeys]: 无法识别的选择器发送到实例0x6a950f0'
从JSON加载的这个NSDictionary的行为方式是什么原因?
谢谢, 跳蚤
答案 0 :(得分:13)
如果您查看'-[__NSCFArray allKeys]
的异常,则表示您实际上拥有__NSCFArray
,它是NSArray
的私有子类。这不是NSDictionary
,这就是您获得例外的原因。
如果您查看JSON Feed,则其形式为
[
{
coordinates: null,
truncated: false,
// ...
},
{
coordinates: null,
truncated: false,
// ...
}
]
在JSON []
代表一个数组,{}
代表一个对象。
[JSON]数组是值的有序集合
这意味着可以轻松地将JSON数组映射到NSArray
。
[JSON]对象是一组无序的名称/值对
这意味着JSON对象可以映射到NSDictionary
。
所以看看Feed我们可以看到我们实际上有一个对象数组。哪个NSJSONSerialization
会变成NSArray
NSDictionary
个。因此,为了获取字典,我们首先需要从数组中访问它,结果是:
NSDictionary *tweet = [publicTimeline objectAtIndex:0];
NSArray *allKeys = [tweet allKeys];
答案 1 :(得分:1)
错误告诉您的是publicTimeline
不是NSDictionary
而是NSArray
。
所以,我的猜测是,而不是
NSArray *allKeysArray = [publicTimeline allKeys];
这可以按你的意愿运作。
NSArray *allKeysArray = [[publicTimeline objectAtIndex:0] allKeys];