iOS 后台返回json解析出现的null的解决办法

在后台返回值为Null为空时,我们代码没有判断时,程序就会崩溃。当时一直很疑惑是为啥,后来发现是数据问题,由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据。当我们通过一些第三方数据解析库解析数据后,就会是下图这种数据格式。null既不是字符串也不是nil所以我们有些判断是没用的。

null

解析成对象之后,如果直接向这个对象发送消息(length,count 等等)就会直接崩溃。提示错误为

-[NSNull length]: unrecognized selector sent to instance 0x388a4a70

解决办法

1.对取值对象类型判断。缺点是太过繁琐,每次都要写。

#define kDictIsEmpty(dic) ([dic isKindOfClass:[NSNull class]])//宏
if (![@"你要取的值" isKindOfClass:[NSNull class]]){
//数据
}

2.字符串匹配。在获取到服务器返回的Json时(返回结果是string对象)通过stringByReplacingOccurrencesOfString方法,替换"null"为"空字符",然后解析。不过通过这个方法也有可能导致数据无法解析

json = [jsonStr  stringByReplacingOccurrencesOfString:@":null" withString:@""];

3.解析时把null 类型替换成nil。

//有返回值的宏
#define isToNull(value) \
({\
   id tmp;\
    if (![value isKindOfClass:[NSNull class]])\
        tmp = value;\
    else
        tmp = nil;\ 
    (tmp);\
})\

//调用方法
label.text = isToNull(dic[@"data"]);

4.如果使用是AFNetwork做网络请求的话,可以用以下代码,会自动去除空值

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
response.removesKeysWithNullValues = YES;//去除空值
manager.responseSerializer = response;//申明返回的结果是json类

去除前

去除前

去除后 所有为空的键值对都会被自动去除

去除后

5.最有效而且简单的方法。使用国外一位大牛写的Category,叫做NullSafe ,在运行时操作,把空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。
具体使用方法项目有说明

NullSafe链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 10,913评论 0 11
  • 毕业几天的我,刚进一个单位,没有适应这里的节奏,午睡时突然想起,如果高中的我知道我现在的生活一定会特别羡慕。想想这...
    爱美丽的小静阅读 199评论 0 0
  • 通常,体寒的女孩子会非常怕冷,手脚冰凉。 很多女生仗着自己年轻并不把体寒当一回事,殊不知,如果长期处于严重体寒的话...
    青青优农阅读 413评论 0 0
  • 12年7月入职,已经是两年工作经验的员工了。 初来乍到的时候还心想,广阔天地大有作为,后来沦陷在改Bug的汪洋大海...
    草头溪阅读 177评论 0 1