服务器返回的JSON数据,通过NSJSONSerialization转成的NSDictionary有可能会包含NSNull类型的对象,如果直接使用NSNull就会导致程序崩溃,所以简单写了个小算法来清除NSDictionary/NSArray中的NSNull。
// 移除集合中的NSNull
- (id)removeNull:(id)object {
if ([object isKindOfClass:NSDictionary.class]) {
NSMutableDictionary *dic = [object mutableCopy];
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:NSDictionary.class] ||
[obj isKindOfClass:NSArray.class] ||
[obj isKindOfClass:NSNull.class]) {
dic[key] = [self removeNull:obj];
}
}];
object = dic.copy;
} else if ([object isKindOfClass:NSArray.class]) {
NSMutableArray *array = [object mutableCopy];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:NSDictionary.class] ||
[obj isKindOfClass:NSArray.class] ||
[obj isKindOfClass:NSNull.class]) {
array[idx] = [self removeNull:obj];
}
}];
object = array.copy;
} else if ([object isKindOfClass:NSNull.class]) {
object = @""; // 将NSNull换成空字符
}
return object;
}
测试一下:
NSDictionary *dic = @{@"0": [NSNull null],
@"1": @[@0,
@{@"0": [NSNull null],
@"1": @[@0, @1, @2, [NSNull null]],
@"2": @{@"00": @"00", @"11": @[@0, @1, @2, [NSNull null]]},
@"3": @"3"},
@2,
[NSNull null]],
@"2": @{@"00": @"00", @"11": @[@0, @1, @2, [NSNull null]]},
@"3": @"3"};
NSLog(@"清除前 %@", dic);
dic = [self removeNull:dic];
NSLog(@"清除后 %@", dic);
网友评论