iOS检查密钥存在

时间:2014-09-01 13:05:52

标签: ios json

我需要检查ID中是否存在密钥。

我有这个:

id tab = [NSJSONSerialization JSONObjectWithData:result options:0 error:&jsonParsingError];

我需要检查密钥“name”是否存在,但没有任何作用..

我试过了:

if([tab objectForKey:@"name"])

if([[tab objectForKey:@"name"] isKindOfClass:[NSNull null]]) 

等..但我总是出错:[_ _ NSCFArray objectForKey:]:无法识别的选择器发送到实例

在获取值之前,我需要做些什么来检查密钥是否存在?

3 个答案:

答案 0 :(得分:3)

根据您收到的数据,NSJSONSerialization将为您提供以下三种方式之一:

nil - 如果在解析过程中出现任何错误,则结果为nil。 NSDictionary * - 如果数据是JSON对象,则结果将是NSDictionary *。 NSArray * - 如果数据是JSON数组,结果将是NSArray *。所以你写道:

id tab = [NSJSONSerialization ... ];
if (tab == nil)
{
    NSLog (@"There was an array, tab is nil");
}
else if ([tab isKindOfClass:[NSDictionary class]])
{
    NSDictionary* tabDict = tab;
    // ... Do stuff with tabDict. Don't touch tab anymore. 
}
else if ([tab isKindOfClass:[NSArray class]])
{
    NSArray* tabArray = tab;
    // ... Do stuff with tabArray. Don't touch tab anymore.
}
else
{
    NSLog (@"JSON parser went crazy. Report a bug to Apple");
}

您需要根据文档确定您拥有服务器应该为您提供哪种JSON文档。但是一旦你知道这一点,只是因为你知道服务器假设给你发送一个JSON对象,这并不意味着它 发送给你一个JSON对象。因此,您需要小心并检查您收到的数据,以避免在发生意外情况时您的应用崩溃。

答案 1 :(得分:2)

您需要将tab投射到NSDictionary

NSDictionary *tab = [NSJSONSerialization JSONObjectWithData:result options:0 error:&jsonParsingError];  

NSArray *tab         = [NSJSONSerialization JSONObjectWithData:result options:0 error:&jsonParsingError];  
NSDictionary *dicTab = [tab objectAtIndex:indexPath.row];

然后检查密钥是否存在。

if([tab objectForKey:@"name"]){
    // Yes exists
}  

注意:在将其投放到NSArray之前,您可能需要将其投放到NSDictionary。这完全取决于你的JSON响应。

答案 2 :(得分:1)

只需注意这行代码:

if([[tab objectForKey:@"name"] isKindOfClass:[NSNull null]])

这是错误的。如果要检查对象的类是否为NSNull类,则应检查

if([[tab objectForKey:@"name"] isKindOfClass:[NSNull class]]) // class not null

但是,通过检查

来检查对象是否为NSNull对象更简单快捷
if([tab objectForKey:@"name"] == [NSNull null])

这是有效的,因为[NSNull null]是一个单例对象。只有NSNull类只有一个对象,[NSNull null]将返回该对象。所有NSNull对象都是相同的对象。

如果您的JSON数据包含空值,您将收到NSNull对象。有些服务器永远不会产生空值,有些服务器和初学者的代码会在发生这种情况时崩溃 - 所以检查空值是个好主意。

NSNull值和nil值之间的区别在于,在第一种情况下,服务器实际上包含条目“name”:null,而在第二种情况下,没有条目具有“name”键的条目所有。