ios中json解析出现的null问题

转载 2016年05月30日 10:58:16

在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

文章来源:http://my.oschina.net/iq19900204/blog/408034

iOS在json解析中出现的类似小数溢出的问题

json解析出现的小数溢出问题
  • feng_da_ge
  • feng_da_ge
  • 2017年09月22日 11:16
  • 429

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

在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。 JSON建构有两种结构: json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组...
  • ws1352864983
  • ws1352864983
  • 2016年08月03日 18:18
  • 1485

IOS 返回JSON数据中存在NULL的解决办法

有些后台写的不好,返回数据的字段偶尔有NULL类型存在,如果不直接赋值给其他对象就会造成崩溃。解决办法的主要思路就是将其中的NULL对象转换为@”“空字符串。以下是封装好的方法创建一个字典的分类 ....
  • zzzzllll19
  • zzzzllll19
  • 2016年03月17日 16:36
  • 3268

iOS解析json中null终极解决方案

我的博客原文地址在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。问题现象但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃。其实很早就发现...
  • zl419723
  • zl419723
  • 2016年08月18日 13:10
  • 2259

json中头疼的null

json中头疼的null 在服务器返回 json 数据的时候,时常会出现如下数据 "somevalue":null 这个时候,json 解析的时候,就会吧这个 null 解析成 NS...
  • chun799
  • chun799
  • 2015年10月17日 11:49
  • 6321

iOS 中json解析数据出现中文乱码的问题

一般服务器的编码格式都是UTF8,这样通过json解析下来的的数据,一般中文是不会出现乱码,但是如果服务器的编码格式不是UTF8,通过json解析的数据中的中文容易出现luan乱码,怎么解决这个问题呢...
  • yuanya
  • yuanya
  • 2013年09月27日 14:19
  • 4264

ios解决有关null闪退及json解析数据中null的问题

今天往NSUserdefault中存数组。程序crash了。 给我报错是 Attempt to set a non-property-list object.... 意思就是存入了自定义类型的对...
  • yidu_blog
  • yidu_blog
  • 2016年09月02日 09:22
  • 2214

JSON解析字符串,null变成了"null"

收到一串JSON数据,想从里面解析出需要的成分。很奇怪的是,里面的字符串明明就是null,解析出来的结果确实"null",造成了很大的困扰。 JSON数据: data{ "name": "...
  • u014375869
  • u014375869
  • 2015年07月08日 18:28
  • 4508

iOS --json解析出现null

如果返回的数据有null类型的,需要加个判断 if ([icon_url isKindOfClass:[NSNull class]]) {          ...
  • iotjin
  • iotjin
  • 2015年11月23日 11:55
  • 180

iOS json解析出错

对于json格式,我们并不陌生,但是因为它处于不同的语言标准也不一致。分享一下最近项目出现的json问题: 1、编码问题,在不清楚服务端的编码格式的情况下,我直接使用: NSData ...
  • u012390519
  • u012390519
  • 2014年10月30日 15:41
  • 2260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios中json解析出现的null问题
举报原因:
原因补充:

(最多只允许输入30个字)