如何检查NSDictionary键是否为NULL

时间:2014-09-18 08:19:09

标签: ios objective-c afnetworking-2

我试图检查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"
}

9 个答案:

答案 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)

实际问题是paginationnil这一事实,你无法真正调用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:]

方法,paginationNSNull NSDictionary NSNull 没有objectForKey:方法可以调用。这就是你遇到错误的原因:

  

无法识别的选择器发送到实例

您可以按

进行检查
if ([pagination isKindOfClass:[NSDictionary class]]) {
    id value =[pagination objectForKey:@"key"];
}