NSDictionary分类CLNull(解决服务器返回的json串中含有NSNull类型的数据)

我们在处理服务器返回的数据类型为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];  

第三种方式: 使用 nullSafe ,只需将.m 拖进工程即可

https://github.com/nicklockwood/NullSafe

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,882评论 0 9
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,169评论 18 399
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,022评论 6 13
  • 这些日子我不再写日记,不喜欢记录太多伤感,虽然心里乱七八糟五味杂陈。日落的时候依旧一个人,兜兜转转流年不返,却也没...
    Annie木_ZI阅读 3,372评论 1 1

友情链接更多精彩内容