我们如何识别对象可用于特定键。我试过以下:
for(NSDictionary *item in jsonArray){
if([item objectForKey:@"EventDate"])
NSLog([item objectForKey:@"EventDate"]);
}
这会导致错误代码崩溃:
-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6a567b0
如果密钥不存在,我还发现许多显示objectForKey
的帖子会返回nil
。比我的问题是NSDictionary
类中还有一个方法是“setNilValueForKey”。这怎么可能我们不能用nil对象指定NSDictionary
键,我们也有方法在NSDictionary
中设置对象的nil值。
请先建议,并在第二次查询时告诉我。
答案 0 :(得分:2)
1)您的jsonArray包含除NSDictionaries
之外的其他类型的对象,包括至少一个NSString
。 NSString
不响应objectForKey:因此当您尝试调用它时会抛出异常。您必须查看JSON以确定如何继续执行您正在执行的操作。
2)有一个NSObject
方法setNilValueForKey:
与键值编码有关。这与NSDictionary
无关。如果您确实需要在字典中表示nil,请将[NSNull null]
设置为代表nil的键的对象。
希望这有帮助!
答案 1 :(得分:1)
item不是NSDictionary它是一个String。所以检查你的jsonArray它可能只包含字符串而不是字典
答案 2 :(得分:1)
并非数组中的所有对象都是字典。在处理之前,您需要检查您正在处理的数据类型。像这样:
for(NSObject* item in jsonArray) {
if ([item isKindOfClass:[NSDictionary class]]) {
// do dictionary stuff
}
else if ([item isKindOfClass:[NSString class]]) {
// do string stuff
}
}
答案 3 :(得分:0)
回答第二次查询
有一个名为NSNull的非零对象专门用于在“普通”nil不可接受的情况下表示nils。如果用 [NSNull null] 对象替换你的nils, NSDictionary会将它们取为。不过,你需要在出路时检查NSNull。
详情请参阅here
回答第一次查询
for(id *item in jsonArray)
{
if([item isKindofClass:[NSDictionary class])
{
NSArray *allKeys = [item allKeys];
for(NSString *strKey in allKeys)
{
if([strKey isEqualToString:@"EventDate"])
{
// EventDate key has object
NSLog([item objectForKey:@"EventDate"]);
}
}
}
}