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

解析成对象之后,如果直接向这个对象发送消息(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

iOS 后台返回json解析出现的null的解决办法相关推荐

  1. 返回json格式 不忽略null字段

    返回json格式 不忽略null字段 发布于 353天前  作者 king666  271 次浏览  复制  上一个帖子  下一个帖子  标签: json 如题,一个实体的某个字段如果为null,在转 ...

  2. (配置消息转换器)解决后台返回json数据到前台时页面时中文显示乱码问题

    (配置消息转换器)解决后台返回json数据到前台时页面时中文显示乱码问题 SpringMVC.xml中加 <!-- 配置消息转换器(解决中文乱码问题)--><mvc:annotati ...

  3. json解析出来数据为空解决方法

    json解析出来数据为空解决方法 参考文章: (1)json解析出来数据为空解决方法 (2)https://www.cnblogs.com/yifan72/p/8900825.html (3)http ...

  4. 串口发数据到android数据错误,51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法...

    原标题:51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法 JSON(Java Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMA (欧洲计 ...

  5. VS中无法解析的外部命令的解决办法

    VS中无法解析的外部命令的解决办法 报错LNK2005外部符号 报错LNK2019外部符号 报错LNK1120外部符号 解决办法1: 检查自己报错的代码里,是否有类里声明的函数没有对应的实现.比如在p ...

  6. org.activiti.engine.ActivitiIllegalArgumentException: inputStream for resource '**' is null 的解决办法

    关于这个问题,是在使用Activiti流程引擎完成项目的建设的过程中遇到的,如下图: 具体内容如下: org.activiti.engine.ActivitiIllegalArgumentExcept ...

  7. iOS微信分享,提示“未验证应用”的解决办法

    iOS微信分享,提示"未验证应用"的解决办法 nginx配置下面代码 方法1: #iOS微信分享,提示"未验证应用"的解决办法location /apple-a ...

  8. [原创]多多返利登陆后台提示验证码错误或无法登陆的解决办法

    登陆后台提示验证码错误或无法登陆或会员注册后无法登陆的解决办法 . 打开php.ini  搜索session.use_cookies = 0 把0 改为1 重启 IIS 或Apache就可以了. 转载 ...

  9. Qt 错误: LNK2019: 无法解析的外部符号 原因及解决办法

    Qt 错误: LNK2019: 无法解析的外部符号 原因及解决办法 删除Qt中的一些用不到的函数或者添加一个新的.ui窗口的时候,我遇到了这个LINK2019无法解析的外部符号错误,网上查了半天可算解 ...

最新文章

  1. Python、Unicode和中文
  2. tinyint占几个字节_随笔几个小问题
  3. 【java】switch的用法介绍
  4. 慢慢看Spring源码
  5. 拓端tecdat|R语言实现 Copula 算法建模相依性案例分析报告
  6. 记使用springboot过程中遇到的一个问题
  7. Spring Cloud
  8. windows默认共享的打开和关闭
  9. 教你年入100万,互联网赚钱三板斧!
  10. 多云时代下数据管理技术_建立一个混合的多云数据湖并使用Apache Spark执行数据处理...
  11. 基于arduino 开发 esp32 点亮ili9341屏幕
  12. 最全Java各修饰符详解(接口、类、方法、变量)
  13. offsetParent与parentElement ,parentNode,parentElement,childNodes和children
  14. 通识~FIR数字滤波器设计讲解
  15. Java系列: 如何在Eclipse中安装Memory Analyzer插件
  16. 睡眠的一场革命!-读《睡眠革命》笔记(中)
  17. GTK入门学习:glade的使用
  18. 291. 蒙德里安的梦想
  19. 2018年牛客多校算法寒假训练营练习比赛(第四场)
  20. 9种免费图像优化工具

热门文章

  1. Linux各个文件夹的作用~~~非常实用!!
  2. Spring Cloud Dalston.SR5 BUG一记
  3. 20155216 Exp5 MSF基础应用
  4. 项目管理(五)- 风险检测表
  5. android call require api level
  6. 初始化资源管理器 winform
  7. 云安全:云访问安全代理(CASB)系统的陷阱和潜力
  8. 打不死的redis集群
  9. 最小生成树--prim+优先队列优化模板
  10. Linux用户管理与权限