ios中json解析现身的null难点必发88手机客户端,iOS中json解析出现的null

*注:其中第6行的写法是固定的:字段类型及后面的。

解决方法

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

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

?

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

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

2、后来想彻底解决这问题,就打算从数据源下手,其实应该可以用正则表达式匹配这个null
,然后进行替换,奈何正则是我的硬伤啊。于是就相出了一个山寨方法:字符串匹配。在获取到服务器返回的Json时,返回结果时string对象,于是就先替换
null 为 为空字符””,然后再解析。

?

1 json = [jsonStr  stringByReplacingOccurrencesOfString:@":null" withString:@":\"\""];

这个方法本来很奏效,但是我这里的服务器返回极不简洁,各种垃圾数据(不吐槽这了)。。。反正这样会导致json无法解析了。

3、最后没有办法,只能在解析的时候下手,把是NSNull 类型的值替换成nil。
一般就写个tool方法,然后解析时调用。但是嫌太麻烦,就想弄写个宏,通过搜索惊奇的发现宏也是可以有返回值的,结果如下:

?

1 2 3 4 5 6 7 8 #define VerifyValue(value)\ ({id tmp;\ if ([value isKindOfClass:[NSNull class]])\ tmp = nil;\ else\ tmp = value;\ tmp;\ })\

宏里的最后一句语句便是返回值。然后在解析数据时调用宏:

?

1 contact.contactPhone = VerifyValue(contactDic[@"send_ContactPhone"]);

4、如果你使用AFNetwork
这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值

?

1 self.removesKeysWithNullValues = YES;

5、终极方案
终于找到了一劳永逸的方案,牛逼的老外写了一个Category,叫做NullSafe
,在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做,对,就是这么简单。详细的请去Github上查看;

 

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

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

用了快半年,在个人项目,以及公司部分项目上使用了,暂时还没遇到大的问题,和性能问题。

iOS中json解析出现的null,nil,NSNumber的问题,jsonnsnumber

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

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

开发新的系统,DB部分使用了SQL Server从2016版开始自带的Json解析方式。

问题现象

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

?

1 "somevalue":null

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

?

1 somevalue = "<null>";

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

?

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

因为字段实在太多,就找一个补一个。
2、后来想彻底解决这问题,就打算从数据源下手,其实应该可以用正则表达式匹配这个null
,然后进行替换,奈何正则是我的硬伤啊。于是就相出了一个山寨方法:字符串匹配。在获取到服务器返回的Json时,返回结果时string对象,于是就先替换
null 为 为空字符””,然后再解析。

传参内容如下:

#define VerifyValue(value)
({id tmp;
if ([value isKindOfClass:[NSNull class]])
tmp = nil;
else
tmp = value;
tmp;
})

今天在解析Json的多级参数遇到了点小问题,在此记录一下:

contact.contactPhone = VerifyValue(contactDic[@"send_ContactPhone"]);
1 select    ID, Quantity, FileID=f.value
2 from    openjson (@json, '$.Positions')
3 with (
4     ID int, 
5     Quantity int,
6     Files nvarchar(max) '$.Files' as json
7 ) x
8 cross    apply openjson(x.Files, '$') f
self.removesKeysWithNullValues = YES;

5、终极方案终于找到了一劳永逸的方案,牛逼的老外写了一个Category,叫做NullSafe ,在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做,对,就是这么简单。详细的请去Github上查看;[https://github.com/nicklockwood/NullSafe](https://github.com/nicklockwood/NullSafe)

原文地址:[http://www.pan-apps.com/668.html](http://www.pan-apps.com/668.html)

解析的SQL Script如下:

somevalue = "<null>";
1 declare @json varchar(max)=N'{"Customer":36,"Positions":[{"ID":0,"Quantity":180000,"Files":[180,177,175,172,170,169,167,164,161,162,159,158,153,152]}]}';

4、如果你使用AFNetwork
这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值

 

这个方法本来很奏效,但是我这里的服务器返回极不简洁,各种垃圾数据(不吐槽这了)。。。反正这样会导致json无法解析了。
3、最后没有办法,只能在解析的时候下手,把是NSNull 类型的值替换成nil。
一般就写个tool方法,然后解析时调用。但是嫌太麻烦,就想弄写个宏,通过搜索惊奇的发现宏也是可以有返回值的,结果如下:

查询文档,发现这种解析需要制定的字段类型,并准成json才行。

在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。
问题现象
但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃。其实很早就发现了原因:由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据:

想解析出Positions里面的Files,但是一直报错,或者NULL。

"somevalue":null
json = [jsonStr  stringByReplacingOccurrencesOfString:@":null" withString:@":\"\""];

解决方法
其实一直没有找到完美的解决办法,坑了我很久。
1、最开始的解决方法就是为了应付当前遇到的崩溃,看看哪个字段可能为空,那么就对该字段使用前进行判断,通过崩溃时的错误提示可以看出,这样的字段解析成的对象是
NSNull 类型的,所以可以直接判断是不是此类型:
if (![isKindOfClass:[NSNull class]]){xxxxxxx;}

宏里的最后一句语句便是返回值。然后在解析数据时调用宏: