0

以下旨在捕获 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'

谁能建议这里有什么问题?

值得注意的是,我确实有一个可以将 NSNull 转换为 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
4

3 回答 3

1

您没有检查 if responseis 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.

于 2016-05-26T11:36:41.873 回答
1

试试这样

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

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

        //Do your task here
    }

}

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

更新 :

   if (!(jsonResults==nil)) {

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

        //Do your task here
    }

}

无需NSNull检查jsonResults. It only can benil和 objects 包含的 that jsonResultscan be NSNull

希望这会有所帮助:)

于 2016-05-26T11:39:15.517 回答
0

而不是[jsonResults isKindOfClass:[NSNull class]]你可以简单地做jsonResults == [NSNull null]

于 2016-05-26T11:34:24.953 回答