ios中json解析出现的null问题
来源:互联网 发布:运动控制算法 编辑:程序博客网 时间:2024/06/05 17:05
在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。
问题现象
但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃。其实很早就发现了原因:由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据:
"somevalue"
:null
通过JsonKit 这个第三方库解析出来的数据就成了
somevalue =
"<null>"
;
这个数据类型不是nil 也不是 String。 解析成对象之后,如果直接向这个对象发送消息(eg:length,count 等等)就会直接崩溃。提示错误为:
-[
NSNull
length]: unrecognized selector sent to instance 0x388a4a70
解决方法
其实一直没有找到完美的解决办法,坑了我很久。
1、最开始的解决方法就是为了应付当前遇到的崩溃,看看哪个字段可能为空,那么就对该字段使用前进行判断,通过崩溃时的错误提示可以看出,这样的字段解析成的对象是 NSNull 类型的,所以可以直接判断是不是此类型:
if
(![isKindOfClass:[
NSNull
class
]]){xxxxxxx;}
因为字段实在太多,就找一个补一个。
2、后来想彻底解决这问题,就打算从数据源下手,其实应该可以用正则表达式匹配这个null ,然后进行替换,奈何正则是我的硬伤啊。于是就相出了一个山寨方法:字符串匹配。在获取到服务器返回的Json时,返回结果时string对象,于是就先替换 null 为 为空字符””,然后再解析。
json = [jsonStr stringByReplacingOccurrencesOfString:@
":null"
withString:@
":\"\""
];
这个方法本来很奏效,但是我这里的服务器返回极不简洁,各种垃圾数据(不吐槽这了)。。。反正这样会导致json无法解析了。
3、最后没有办法,只能在解析的时候下手,把是NSNull 类型的值替换成nil。 一般就写个tool方法,然后解析时调用。但是嫌太麻烦,就想弄写个宏,通过搜索惊奇的发现宏也是可以有返回值的,结果如下:
#define VerifyValue(value)\
({
id
tmp;\
if
([value isKindOfClass:[
NSNull
class
]])\
tmp =
nil
;\
else
\
tmp = value;\
tmp;\
})\
宏里的最后一句语句便是返回值。然后在解析数据时调用宏:
contact.contactPhone = VerifyValue(contactDic[@
"send_ContactPhone"
]);
4、如果你使用AFNetwork 这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值
self
.removesKeysWithNullValues =
YES
;
5、终极方案
终于找到了一劳永逸的方案,牛逼的老外写了一个Category,叫做NullSafe ,在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做,对,就是这么简单。详细的请去Github上查看;
https://github.com/nicklockwood/NullSafe
- ios中json解析出现的null问题
- iOS中json解析出现的null问题
- ios中json解析出现的null问题
- ios中json解析出现的null问题
- ios中json解析出现的null问题
- ios中json解析出现的null问题
- ios中json解析出现的null问题
- ios中json解析出现的null问题
- iOS中json解析出现的null,nil,NSNumber的问题
- iOS --json解析出现null
- ios解决有关null闪退及json解析数据中null的问题
- iOS 中json解析数据出现中文乱码的问题
- iOS 中json解析数据出现中文乱码的问题
- iOS中json解析出现的null,nil,NSNumber的解决办法
- iOS 后台返回json解析出现的null的解决办法
- iOS解析json中null终极解决方案
- iOS在json解析中出现的类似小数溢出的问题
- iOS json解析数据中文出现乱码的问题
- Maven配置多源代码目录、多资源目录
- Aircrack-ng 源码安装
- (4.1.36.6)android Graphics(四):canvas变换与操作
- 微信支付遇到的坑
- NSCalendar 日历类
- ios中json解析出现的null问题
- android应用开发框架+即时通讯IM app开发(1)-前言和工程目录结构
- Windows下的回车换行转换Linux系统下的回车换行
- 王学岗ListView和源码解析(一)
- 来往网页版扫码自动登录的实现原理(微信也是一样)
- 文章标题
- 关于win10X64 连接oracle
- android编译源码5.1.1刷真机nexus5系统
- 公平锁与非公平锁