iOS中json解析出现的null,nil,NSNumber的解决办法

2016-02-19 09:04 10 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享iOS中json解析出现的null,nil,NSNumber的解决办法吧。

【 tulaoshi.com - 编程语言 】

在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。

JSON建构有两种结构:

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组2种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在js中表示为“{}”扩起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

2、数组:数组在js中是中括号“[]”扩起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。

经过对象、数组2种结构就可以组合成复杂的数据结构了。

问题现象

但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃。其实很早就发现了原因:由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据:

"somevalue":null

通过JsonKit 这个第三方库解析出来的数据就成了

somevalue = "null";

这个数据类型不是nil 也不是 String。 解析成对象之后,如果直接向这个对象发送消息(eg:length,count 等等)就会直接崩溃。提示错误为:

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

解决方法

其实一直没有找到完美的解决办法,坑了我很久。

1、最开始的解决方法就是为了应付当前遇到的崩溃,看看哪个字段可能为空,那么就对该字段使用前进行判断,通过崩溃时的错误提示可以看出,这样的字段解析成的对象是 NSNull 类型的,所以可以直接判断是不是此类型:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

if (![isKindOfClass:[NSNull class]]){xxxxxxx;}

因为字段实在太多,就找一个补一个。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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上查看;

来源:http://www.tulaoshi.com/n/20160219/1589396.html

延伸阅读
iPhone越狱安装插件出现安全模式的解决办法   iOS8.4越狱推出已有一个多星期,想必有不少果粉都已经完成了越狱操作,并开始下载各种插件为iPhone增加玩机乐趣。不过,几乎在每次的越狱中都会有部分用户由于安装了不兼容的插件而出现安全模式(Safe Mode) ,并且很多人在iPhone进入安全模式之后不知该怎么解决,今天,我们就一起来认...
ios8.3完美越狱卡住20%解决办法   昨天晚上,国内知名太极越狱团队推出了大家期待已久的ios8.3太极越狱2.0.0版.目前有不少果粉迫不及待的进行了越狱尝鲜,而在越狱过程中不少果粉遇到太极越狱2.0.0版本卡在20%的情况,那么遇到太极越狱卡在20%怎么办呢?下面百事网图老师小编带来相关解决办法,tuLaoShi.com一起来看看吧! 一...
标签: windows 操作系统
有些文件已经没有用了,我们又不想让他放在那占用硬盘资源,但是想删又删不了,这种时间我们应该怎么办呢?请看下面文章中关于Windows 2000/XP中无法删除文件故障的解决办法。 出现这类问题一般有以下几种情况: 一:位于NTFS文件系统上,而起使用了ACL(Access Control List),没有权限访问你要删除的文件; 二:文...
有锁iPhone升级iOS9出现本机号码未知的解决办法   苹果昨天推送了iOS9,对于有锁机用户来说,如果想体验新系统,就要面对升级后出现【本机号码未知、热点不能激活、打电话+86】等问题,那么,有锁iPhone升级iOS9之后出现本机号码未知等问题该怎么解决呢?其实替换一下运营商文件就可以了。下面是操作方法(以联通为例): 1、把...
夏季控油:合理使用护肤品 夏季脸上出油的原因很可能是没有选对护肤产品。很多人无论春夏秋冬都是用的同种类型的护肤品,这种做法是错误的。因为夏季天气炎热,而人体油脂分泌比其他季节要旺盛,所以要选对夏季护肤产品。同时,因为多数人脸上出油的部位都是在T区鼻翼两边。而很多人在使用护肤品时全脸都使用一样的产品,这种做法也是错...

经验教程

728

收藏

22
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部