IOS:从JSON中检测NSNull不起作用

时间:2016-05-26 11:28:00

标签: ios json nsnull

以下用于在Json结果中捕获NSNull的代码在响应为null时抛出异常。

 NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"jsonResults are:%@",jsonResults);
                if (![jsonResults isKindOfClass:[NSNull class]]&&!
[jsonResults[@"response"][@"insert_id"]isKindOfClass:[NSNull class]]&&!
(jsonResults==nil)){
    //do something
    }

发生异常时,以if (![json...开头的行显示为绿色,错误消息显示为:

     Results: {
        code = 400;
        response = "0(NSNull)";
    }
    2016-05-26 07:18:06.327 idaru[385:60b] -[NSNull 
objectForKeyedSubscript:]: unrecognized selector sent to instance 
0x38871a70
    2016-05-26 07:18:06.329 myapp[385:60b] *** Terminating app due to 
uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull 
objectForKeyedSubscript:]: unrecognized selector sent to instance 
0x38871a70'

有人能说出这里可能出错的地方吗?

值得注意的是,我确实有一个类别可以将NSNulls转换为0。不知道这与上面如何相互作用,但现在是:

//NSNull+JSON.m
@implementation NSNull (JSON)

- (NSUInteger)length { return 0; }

- (NSInteger)integerValue { return 0; };

- (float)floatValue { return 0; };

- (NSString *)description { return @"0(NSNull)"; }

- (NSArray *)componentsSeparatedByString:(NSString *)separator { return @[]; }

- (id)objectForKey:(id)key { return nil; }

- (BOOL)boolValue { return NO; }

@end

3 个答案:

答案 0 :(得分:1)

您不会检查response是否为NSNull。我的方法是测试你想要的东西,而不是你不想要的东西:

NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if (jsonResults) {    // This won't be NSNull, it will be nil on error
    NSDictionary *response = jsonResults[@"response"];
    if ([response isKindOfClass:[NSDictionary class]]) {
        NSNumber *insertId = response[@"insert_id"];    // Assumption
        if ([insertId isKindOfClass:[NSNumber class]]) {
            // Print value
        }
    }
} else {
    // Report error
}

实际上,您需要知道哪些值是可选的,哪些值可以是不同类型,因为您不想使用isKindOfClass对整个模块进行编码。

答案 1 :(得分:1)

尝试这样,

  if (![jsonResults isKindOfClass:[NSNull class]] || !(jsonResults==nil)) {

    if (![jsonResults[@"response"][@"insert_id"]isKindOfClass:[NSNull class]]) {

        //Do your task here
    }

}

这是因为如果您的jsonResults为null,则无法检查[jsonResults[@"response"][@"insert_id"] !!

更新:

   if (!(jsonResults==nil)) {

    if (![jsonResults[@"response"][@"insert_id"]isKindOfClass:[NSNull class]]) {

        //Do your task here
    }

}

无需为NSNull检查jsonResults。它只能是niljsonResults所包含的对象可以是NSNull

希望这会有所帮助:)

答案 2 :(得分:0)

您只需执行[jsonResults isKindOfClass:[NSNull class]]

,而不是jsonResults == [NSNull null]