我们在处理服务器返回的数据类型为NSNull时,程序就会闪退。我们可以先判断该数据类型是否为NSNull,是就返回,不是在使用它。但这是不是太麻烦累。NSDictionary分类CLNull就是为解决这个问题来的。
思路:
给NSDictionary添加分类,对外提供一个+(id)changeType:(id)object方法。将Null类型的项目转化成@""。
效果:
具体实现如下(代码中有必要的注释):
//将NSDictionary中的Null类型的项目转化成@""
+(NSDictionary *)nullDic:(NSDictionary *)dict
{
NSArray *keyArr = [dict allKeys];
NSMutableDictionary *resDic = [[NSMutableDictionary alloc]init];
for (int i = 0; i < keyArr.count; i ++)
{
id obj = [dict objectForKey:keyArr[i]];
obj = [self changeType:obj];
[resDic setObject:obj forKey:keyArr[i]];
}
return resDic;
}
//将NSArray元素中的NSDictionary中的Null类型的项目转化成@""
+(NSArray *)nullArr:(NSArray *)array
{
NSMutableArray *resArr = [[NSMutableArray alloc] init];
for (int i = 0; i < array.count; i ++)
{
id obj = array[i];
obj = [self changeType:obj];
[resArr addObject:obj];
}
return resArr;
}
//将NSString类型的原路返回
+(NSString *)stringToString:(NSString *)string
{
return string;
}
//将NSString为Null类型的转化成@""
+(NSString *)nullToString
{
return @"";
}
#pragma mark - 公有方法
//类型识别:将所有的NSNull类型转化成@""
+(id)changeType:(id)object
{
if ([object isKindOfClass:[NSDictionary class]]){
return [self nullDic:object];
}
else if([object isKindOfClass:[NSArray class]]){
return [self nullArr:object];
}
else if([object isKindOfClass:[NSString class]]){
return [self stringToString:object];
}
else if([object isKindOfClass:[NSNull class]]){
return [self nullToString];
}
else{
return object;
}
}
使用方法:
[NSDictionary changeType:dict];
第二种方法是利用AFNetworking的自动解析,去除掉值为null的键值对,代码如下:
_manager = [AFHTTPRequestOperationManager manager];
AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
response.removesKeysWithNullValues = YES;
_manager.responseSerializer = response;
_manager.requestSerializer = [AFJSONRequestSerializer serializer];