美文网首页OC 开发分类(Category)iOS DeveloperiOS学习笔记
NSDictionary分类CLNull(解决服务器返回的jso

NSDictionary分类CLNull(解决服务器返回的jso

作者: 逍遥晨旭 | 来源:发表于2017-05-25 16:44 被阅读121次

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

    相关文章

      网友评论

      本文标题:NSDictionary分类CLNull(解决服务器返回的jso

      本文链接:https://www.haomeiwen.com/subject/zirzxxtx.html