如何检查NSDictionary的键是否为NULL

4
我正在尝试检查我的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"
}

如果字典中的键next_max_id对应的对象为null,那么是否有键next_max_id可用。 - dheeru
如果没有值,next_max_id 将不存在。JSON 响应将会是这样的 pagination = {}; - Scott
9个回答

6
if( [pagination objectForKey:@"your_key"] == nil ||  
    [[pagination objectForKey:@"your_key"] isEqual:[NSNull null]] ){
    //nil dictionary
}

4

根据您所描述的错误,分页(pagination)不是一个NSDictionary对象,而是一个NSNull对象。因此,在进行其他操作之前,首先需要检查:

if (pagination == [NSNull null]) ...

如果你的JSON数据包含"pagination":{},那么这种情况就不会发生;但如果你的JSON数据包含"pagination":null,那么就会发生。

1

用这种方式检查

[pagination objectForKey:@"next_max_id"] == [NSNull null]

如果这不起作用,请尝试:
[pagination objectForKey:@"next_max_id"] == (id)[NSNull null]

1
实际问题是 paginationnil,你无法在 NSNull 上调用任何选择器。正如你所提到的 - 只有当 pagination JSON 为空时才会出现问题 - 因此你会得到一个空对象。
所以,
if (pagination && ![pagination isKindOfClass:[NSNull class]]) {
    ... // Do your things
}

如果分页是一个有效的NSDictionary对象,那么对于不存在的键使用objectForKey:将返回nil

0

-[NSNull objectForKey:]: 无法识别的选择器发送到实例

错误已经在你手中。

当你调用 [pagination objectForKey:]时,它会调用 -[NSNull objectForKey:]

这意味着,paginationNSNull,而不是 NSDictionaryNSNull 没有 objectForKey: 方法可供调用。这就是为什么你会收到以下错误:

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

您可以通过以下方式检查:

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

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提到了这里


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
}

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");
}

应该使用for循环,类似下面的代码: for (int i = 0; i<pagination.count; i++) { if ([array containsObject:@"next_max_id"]) { NSLog(@"%@",[pagination valueForKey:@"next_max_id"]); } else { NSLog(@"Key is null"); } } - Deepak

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"]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接