iOS检查密钥存在

问题描述:

我需要检查一个密钥是否存在于一个id中。iOS检查密钥存在

我有这样的:

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

我需要检查,如果该键 “名” 的存在,但没有任何工程..

我想:

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

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

等。但我总是错误:[__NSCFArray objectForKey:]:无法识别的选择发送到实例

我必须做什么检查密钥是否存在之前获取值?

+0

检查valueForKey。 – Jitendra 2014-09-01 13:07:26

+0

确实... omg ... Thx – deveLost 2014-09-01 13:18:12

+0

可能发生,因为'NSArray'没有像'-objectForKey:'这样的方法,该方法是例如的特权。 'NSDictionary'类;请参阅此处的'NSArray'类引用:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html – holex 2014-09-01 13:36:05

您需要将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 
} 

注:可能是你需要它铸造NSDictionary之前扔在NSArray。它完全取决于你的JSON响应。

+0

您错过了星号;)NSDictionary * tab =。 ..; – Matz 2014-09-01 14:09:47

+0

这不会有帮助,因为OP有一个数组,而不是字典。 – gnasher729 2014-09-01 14:25:56

+0

@Matz谢谢,我更新了我的答案。 – iEngineer 2014-09-01 14:27:34

根据您所收到的数据,NSJSONSerialization会给你的三种可能的事情之一:

零 - 如果在分析过程中的任何错误,结果是零。 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对象。所以你需要小心并检查你收到的数据,以避免你的应用崩溃,如果意外发生。

只是陈述关于这行代码:

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

这是不对的。如果你想检查是否有类对象是NSNull类,你会检查

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

但是,它更简单,更快速通过检查

if([tab objectForKey:@"name"] == [NSNull null]) 
来检查对象是否是NSNull对象

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

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

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