在NSDictionary上调用包含JSON对象的allKeys时出错

时间:2012-01-16 19:16:53

标签: objective-c nsdictionary

我正在使用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的行为方式是什么原因?

谢谢, 跳蚤

2 个答案:

答案 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];