美文网首页iOS
iOS中json数据存在NULL的问题

iOS中json数据存在NULL的问题

作者: 忘带充电宝de皮卡丘 | 来源:发表于2017-03-23 11:24 被阅读0次

    问题现象

    本人最近发现写的几个项目都会遇到一个严重的坑,程序在获取某些数据之后莫名崩溃(其实很早就发现了,只是不想去解决)。原因:由于服务器返回数据的字段偶尔有NULL类型存在,然后以Json形式返回给客户端时就会出现这样的数据,如果直接赋值给其他对象就会造成崩溃。

    解决方法

    一、如果你使用AFNetwork 这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值

    AFNetWorking移除空值

    二、创建一个字典的分类

    .h文件

    #import <Foundation/Foundation.h>

    @interfaceNSDictionary (SetNullStr)

    +(id)changeType:(id)myObj;

    @end

    .m文件

    #import"NSDictionary+SetNullStr.h"

    @implementationNSDictionary (SetNullStr)

    //将NSDictionary中的Null类型的项目转化成@""

    +(NSDictionary*)nullDic:(NSDictionary*)myDic

    {

    NSArray*keyArr = [myDicallKeys];

    NSMutableDictionary*resDic = [[NSMutableDictionaryalloc]init];

    for(inti =0; i < keyArr.count; i ++)

    {

    idobj = [myDicobjectForKey:keyArr[i]];

    obj = [selfchangeType:obj];

    [resDicsetObject:objforKey:keyArr[i]];

    }

    returnresDic;

    }

    //将NSArray中的Null类型的项目转化成@""

    +(NSArray*)nullArr:(NSArray*)myArr

    {

    NSMutableArray*resArr = [[NSMutableArrayalloc]init];

    for(inti =0; i < myArr.count; i ++)

    {

    idobj = myArr[i];

    obj = [selfchangeType:obj];

    [resArraddObject:obj];

    }

    returnresArr;

    }

    //将NSString类型的原路返回

    +(NSString*)stringToString:(NSString*)string

    {

    returnstring;

    }

    //将Null类型的项目转化成@""

    +(NSString*)nullToString

    {

    return@"";

    }

    //主要方法

    //类型识别:将所有的NSNull类型转化成@""

    +(id)changeType:(id)myObj

    {

    if([myObjisKindOfClass:[NSDictionaryclass]])

    {

    return[selfnullDic:myObj];

    }

    else if([myObjisKindOfClass:[NSArrayclass]])

    {

    return[selfnullArr:myObj];

    }

    else if([myObjisKindOfClass:[NSStringclass]])

    {

    return[selfstringToString:myObj];

    }

    else if([myObjisKindOfClass:[NSNullclass]])

    {

    return[selfnullToString];

    }

    else

    {

    returnmyObj;

    }

    }

    @end

    需要转换的时候调用以下方法就OK了,不管有多少个层级,全部转换

    //json表示获取到的带有NULL对象的json数据

    NSDictionary*newDict = [NSDictionary changeType:json];

    三、终极方案

    在网上查询各种方案,最后在GitHub找到一个三方Category,叫做NullSafe ,在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做。详细的请去Github上查看:https://github.com/nicklockwood/NullSafe

    相关文章

      网友评论

        本文标题:iOS中json数据存在NULL的问题

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