在NSDictionary中查找Key的存在

时间:2012-08-30 08:12:26

标签: iphone objective-c nsdictionary nsmutabledictionary

我们如何识别对象可用于特定键。我试过以下:

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值。

请先建议,并在第二次查询时告诉我。

4 个答案:

答案 0 :(得分:2)

1)您的jsonArray包含除NSDictionaries之外的其他类型的对象,包括至少一个NSStringNSString不响应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"]);
     }
    }
  }
}