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:]:无法识别的选择发送到实例
我必须做什么检查密钥是否存在之前获取值?
您需要将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响应。
您错过了星号;)NSDictionary * tab =。 ..; – Matz 2014-09-01 14:09:47
这不会有帮助,因为OP有一个数组,而不是字典。 – gnasher729 2014-09-01 14:25:56
@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”在所有。
检查valueForKey。 – Jitendra 2014-09-01 13:07:26
确实... omg ... Thx – deveLost 2014-09-01 13:18:12
可能发生,因为'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