2012-01-16 62 views
2

我通过苹果从这里http://bit.ly/x4nhG5错误呼吁的NSDictionary方含allKeys当JSON对象

显示Twitter的饲料从示例代码示例工作,代码走的是JSON,并把它变成一个NSDictionary:

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

我只是想在这一点上做的是看看所有的回来做这个键:

NSArray *allKeysArray = [publicTimeline allKeys]; 

我再接收地e尝试运行程序时发生错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray allKeys]: unrecognized selector sent to instance 0x6a950f0'

为什么从JSON加载的NSDictionary的行为如此?

感谢, 旧货

回答

13

如果你看你看'-[__NSCFArray allKeys]异常,这表明你确实有一个__NSCFArray这是NSArray私有子类。这不是NSDictionary,这就是您获得例外的原因。


如果看看JSON给它的形式是

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

JSON[]表示一个数组和{}表示对象。

An [JSON] array is an ordered collection of values

这意味着JSON阵列可以容易地映射到NSArray

An [JSON] object is an unordered set of name/value pairs

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


所以看着饲料,我们可以看到,我们实际上有一个对象数组。其中NSJSONSerialization将变成NSDictionaryNSArray's。因此,要找到字典,我们首先需要从数组中首先访问它,结果如下:

NSDictionary *tweet = [publicTimeline objectAtIndex:0]; 

NSArray *allKeys = [tweet allKeys]; 
+1

谢谢保罗。 Apple在他们的代码中将* publicTimeLine作为一个NSDictionary进行了delcaring。为了使用你的建议;我不得不将* publicTimeLine声明为NSArray。 通过这样做:NSArray * publicTimeline = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonParsingError]; 我能够使用你的例子。 谢谢! – Flea 2012-01-16 20:31:50

+1

'NSDIctionary可能不会响应objectAtIndex'问题。为什么?。我正在使用iOS 6。 – 2014-04-21 14:04:25

1

什么错误告诉你的是,你的publicTimeline不是NSDictionaryNSArray

所以,我的猜测是不是

NSArray *allKeysArray = [publicTimeline allKeys]; 

,你打算这会工作。

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

大麦,NSDictionary不包含objectAtIndex的方法。你会有另外一个建议吗? – Flea 2012-01-16 19:46:33