以下用于在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
答案 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
。它只能是nil
,jsonResults
所包含的对象可以是NSNull
。
希望这会有所帮助:)
答案 2 :(得分:0)
您只需执行[jsonResults isKindOfClass:[NSNull class]]
jsonResults == [NSNull null]