在做网络请求对接接口的时候,经常遇到服务器返回的数据带有null,导致客户端读取的时候出现闪退。
解决方法:
在获取到的数据,转化成NSArray或者NSDictionary的时候,移除带有null对象。
添加两个类别的方法,分别是NSArray和NSDictionary
//
// NSArray+Utils.m
// CommonCode
//
// Created by qianxia on 15/7/25.
// Copyright (c) 2015年 黄旺鑫. All rights reserved.
//
#import "NSArray+Utils.h"
#import "NSDictionary+Utils.h"
@implementation NSArray (Utils)
/**
* 移除所有NSNull对象
* Remove all null objects
*
* @return Returns an array of none null.
*/
- (NSArray *)removeNulls {
// 拷贝为可变数组
NSMutableArray *replaced = [NSMutableArray arrayWithArray:self];
// 移除当前数组中的null对象
[replaced removeObjectsAtIndexes:[self indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
return [obj isKindOfClass:[NSNull class]];
}]];
// 遍历数组,移除当前数组中的元素是数组或字典中包含的null对象
[replaced enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[NSNull class]]) {
/**
* @brief 此处直接移除null,而不是替换为字符串
* 替换成字符串可能导致程序闪退,原因:原本是要NSArray或者NSDictionary对象,我们替换成NSString对象,导致读取出错而闪退
*/
[replaced removeObjectAtIndex:idx];
} else if ([obj isKindOfClass:[NSArray class]]) {
id newObj = [obj removeNulls];
[replaced replaceObjectAtIndex:idx withObject:newObj];
} else if ([obj isKindOfClass:[NSDictionary class]]) {
id newObj = [obj removeNulls];
[replaced replaceObjectAtIndex:idx withObject:newObj];
}
}];
return replaced;
}
@end
//
// NSDictionary+Utils.h
// CommonCode
//
// Created by qianxia on 15/7/25.
// Copyright (c) 2015年 黄旺鑫. All rights reserved.
//
#import "NSDictionary+Utils.h"
#import "NSArray+Utils.h"
@implementation NSDictionary (Utils)
/**
* 移除NSNull对象
*
*/
- (NSDictionary *)removeNulls {
NSMutableDictionary *replaced = [NSMutableDictionary dictionaryWithDictionary:self];
// 遍历字典
[replaced enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if ([obj isKindOfClass:[NSNull class]]) {
/**
* @brief 此处直接移除null,而不是替换为字符串
* 替换成字符串可能导致程序闪退,原因:原本是要NSArray或者NSDictionary对象,我们替换成NSString对象,导致读取出错而闪退
*/
[replaced removeObjectForKey:key];
} else if ([obj isKindOfClass:[NSArray class]]) {
id newObj = [obj removeNulls];
[replaced setObject:newObj forKey:key];
} else if ([obj isKindOfClass:[NSDictionary class]]) {
id newObj = [obj removeNulls];
[replaced setObject:newObj forKey:key];
}
}];
return replaced;
}
@end
调用的时候也是非常简单
// json转换数据
id parameter = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
//移除Null对象
parameter = [parameter removeNulls];