我试图检查JSON响应字典中的密钥next_max_id
是否存在对象。
我已经尝试了以下方法来检查:
if ([[pagination objectForKey:@"next_max_id"] isKindOfClass:[NSNull class]]) ...
if ([pagination objectForKey:@"next_max_id"] == [NSNull class]) ...
if ([pagination objectForKey:@"next_max_id"]) ...
但是,当分页字典为空(即pagination = {};
)时,我收到以下错误消息:
-[NSNull objectForKey:]: unrecognized selector sent to instance ...
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull objectForKey:]: unrecognized selector sent to instance ...
如何在没有崩溃的情况下检查对象或密钥是否存在?
更新:
当next_max_id
内存在密钥pagination
时,JSON响应就像这样
"pagination": {
"next_url": "https://api.instagram.com/v1/tags/puppy/media/recent?access_token=fb2e77d.47a0479900504cb3ab4a1f626d174d2d&max_id=13872296",
"next_max_id": "13872296"
}
答案 0 :(得分:6)
if( [pagination objectForKey:@"your_key"] == nil ||
[[pagination objectForKey:@"your_key"] isEqual:[NSNull null]] ){
//nil dictionary
}
答案 1 :(得分:4)
由于您描述的错误,分页不是NSDictionary,但分页本身是NSNull对象。所以在其他一切之前先进行检查
if (pagination == [NSNull null]) ...
如果您的JSON数据包含“pagination”:{},那么如果您的JSON数据包含“pagination”:null,则会发生这种情况。
答案 2 :(得分:1)
以这种方式检查
[pagination objectForKey:@"next_max_id"] == [NSNull null]
如果这不起作用,请尝试
[pagination objectForKey:@"next_max_id"] == (id)[NSNull null]
答案 3 :(得分:1)
实际问题是pagination
是nil
这一事实,你无法真正调用NSNull
以上的任何选择器。正如您所提到的 - 问题只发生在pagination
JSON为空时 - 因此您得到一个零对象。
所以,
if (pagination && ![pagination isKindOfClass:[NSNull class]]) {
... // Do your things
}
如果分页是有效的NSDictionary
对象,则对于不存在的密钥,objectForKey:
将返回nil
。
答案 4 :(得分:0)
检查密钥是否存在:
if([pagination objectForKey:@"next_max_id"] != nil) {
// exists
}
else {
// not exists
}
检查密钥是否存在且值是null
if([pagination objectForKey:@"next_max_id"] == [NSNull null]) {
// {"next_max_id":null, ...}
}
else {
// not exists or values is not null
}
答案 5 :(得分:0)
例如,我创建了这个演示版,您可以根据自己进行修改
NSDictionary *pagination =
[[NSDictionary alloc] initWithObjectsAndKeys:
@"https://api.instagram.com/v1/tags/puppy/media/recent?access_token=fb2e77d.47a0479900504cb3ab4a1f626d174d2d&max_id=13872296",@"next_url",
@"65765343",@"next_max_id", nil];
NSArray *array = [NSArray arrayWithArray:[pagination allKeys]];
if ( [array containsObject:@"next_max_id"] ) {
NSLog( @"%@",[pagination valueForKey:@"next_max_id"] );
} else {
NSLog(@"Key is null");
}
答案 6 :(得分:0)
if( [pagination objectForKey:@"next_max_id"] == nil ||
[[pagination objectForKey:@"next_max_id"] isEqual:[NSNull null]] ||
[pagination objectForKey:@"next_max_id"] == [NSNull null])
{
NSLog(@"Key is null");
}
else
{
NSLog(@"%@",[pagination valueForKey:@"next_max_id"]);
}
答案 7 :(得分:0)
一个非常优雅的解决方案是为NSDictionary编写一个快速类别。
例如:
#import "NSDictionary+safe.h"
@implementation NSDictionary (safeJSON)
- (id)safeObjectForKey:(NSString *)key {
id object = [self objectForKey:key];
if (object == [NSNull null]) {
return nil;
} else {
return object;
}
}
@end
rckoenes http://joda-time.sourceforge.net/apidocs/org/joda/time/chrono/IslamicChronology.html也提到了这一点。
答案 8 :(得分:0)
- [NSNull objectForKey:]:无法识别的选择器发送到实例
当您致电[pagination objectForKey:]
时,会拨打-[NSNull objectForKey:]
方法,pagination
为NSNull
不 NSDictionary
。 NSNull 没有objectForKey:
方法可以调用。这就是你遇到错误的原因:
无法识别的选择器发送到实例
您可以按
进行检查if ([pagination isKindOfClass:[NSDictionary class]]) {
id value =[pagination objectForKey:@"key"];
}