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链接

转载于:https://www.cnblogs.com/huanghaipo/p/7453086.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值