iOS 后台返回json解析出现的null的解决办法
在后台返回值为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而不会奔溃。
具体使用方法项目有说明
iOS 后台返回json解析出现的null的解决办法的更多相关文章
- Spring mvc 返回JSON 在IE 下提示下载 解决办法
http://www.blogjava.net/iamlibo/archive/2013/11/21/406646.html ————————————————————————————————————— ...
- iOS中处理json解析出现的null,nil的解决办法
最开始是使用的一个函数进行处理,代码如下: - (id) setNoNull:(id)aValue{ if (aValue == nil) { aValue = @"";//为nu ...
- java后台常用json解析工具问题小结
若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...
- spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500:no convertter for return value of type
问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json ...
- 返回json格式 不忽略null字段
返回json格式 不忽略null字段 发布于 353天前 作者 king666 271 次浏览 复制 上一个帖子 下一个帖子 标签: json 如题,一个实体的某个字段如果为null,在 ...
- 用file上传文件时,浏览器返回值总是自动添加<pre>的解决办法
在返回的JSon字符串里面总是莫名其妙的添加了<pre>标签,例如返回内容为"ok",在浏览器里面就变成了"<pre style="word- ...
- 多线程中使用HttpContext.Current为null的解决办法
HttpContext.Current.Server.MapPath(logFile) 这个是得到具体路径的方法 正常情况下是可以的 多线程情况下就为null 下边的代码原本的作用是把网站的异常 ...
- [转]iOS Safari 中click点击事件失效的解决办法
iOS Safari 中click点击事件失效的解决办法 问题起因: 在微信公众号开发(微站)过程中用jquery的live方法绑定的click事件点击无效(不能执行) 问题描述 当使用委托给一个元素 ...
- $('#checkbox').attr('checked'); 返回的是checked或者是undefined解决办法
$('#checkbox').attr('checked'); 返回的是checked或者是undefined解决办法 <input type='checkbox' id='cb'/> ...
随机推荐
- gulpfile.js备份
var gulp = require('gulp'); var uglify = require('gulp-uglify'); // var rename = require('gulp-renam ...
- 切糕(bzoj 3144)
Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...
- APUE 学习笔记(五) 进程环境
1.main函数 C程序总是从main函数开始执行,当内核执行C程序时,在调用main函数之前先调用exec函数从内核获取命令行参数和环境变量值 2.进程终止 正常终止: (1)在main函数内执 ...
- Java-河内塔问题
河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家 Edouard Lucas曾 ...
- JAVA课程设计---多源教学数据管理系统
1.团队课程设计博客链接 https://www.cnblogs.com/hq9-/p/10278470.html 2.个人负责模块或任务说明 (1)到控制台实现GUI界面中浏览文件并选取文件的功能. ...
- 转 PV操作简单理解
传送门 PV操作简单理解 进程通常分为就绪.运行和阻塞三个工作状态.三种状态在某些条件下可以转换,三者之间的转换关系如下: 进程三个状态之间的转换就是靠PV操作来控制的.PV操作主要就是P操作.V操作 ...
- Unity3D Shader 入门之简单案例的实现(通过法线实现颜色变化)
在没有接触Unity3D Shader 之前,总感觉shader特别神奇,因为听说是对渲染流水线进行编程,就是对GPU进行编程.听着特别高大上.这不,最近刚刚接触Shader,学了几个小案例,然后本 ...
- Java-HashMap原理解析
本文分析HashMap的实现原理. 数据结构(散列表) HashMap是一个散列表(也叫哈希表),用来存储键值对(key-value)映射.散列表是一种数组和链表的结合体,结构图如下: 简单来说散列表 ...
- Spring配置项之<aop:aspectj-autoproxy />
通过配置织入@Aspectj切面 虽然可以通过编程的方式织入切面,但是一般情况下,我们还是使用spring的配置自动完成创建代理织入切面的工作. 通过aop命名空间的<aop:aspectj-a ...
- 作为一个新人,怎样学习嵌入式Linux?
作为一个新人,怎样学习嵌入式Linux? 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).尝试着写一些C语言竞赛的题目.它们是纯 ...