Json中null的处理方法

作者: Fiona_L | 来源:发表于2016-04-14 18:28 被阅读1825次

问题描述
在服务器返回 json 数据的时候,时常会出现如下数据

"somevalue":null

通过JsonKit 这个第三方库解析出来的数据就成了
somevalue = "<null>";
这个数据类型不是nil 也不是 String,而是NSNull 的对象。 如果直接向这个对象发送消息就会直接崩溃。提示错误为:

-[NSNulllength]: unrecognized selector sent to instance 0x388a4a70

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

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

但是无法对每个字段逐一进行该操作,所以这种办法仅适用于判断特定字段。
2、用字符串匹配null并进行替换。在获取到服务器返回的Json时,返回结果时string对象,于是就先替换 null 为 为空字符””,然后再解析。

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

这个方法可以写成NSString的category,然后调用相应方法即可,相对简洁,但是如果要对string,array,dictionary都进行判断,也是不小的工作量。而且服务器的数据格式也不能保证,也许会匹配不上。
3、最后没有办法,只能在解析的时候下手,把是NSNull 类型的值替换成nil。 一般就写个tool方法,然后解析时调用。但是嫌太麻烦,就想弄写个宏,通过搜索惊奇的发现宏也是可以有返回值的,结果如下:

#define VerifyValue(value)
({idtmp;
      if([value isKindOfClass:[NSNullclass]])
            tmp =nil;
      else
            tmp = value;
      tmp;
})

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

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

这个方法其实和方法三是类似的思想。
4、如果你使用AFNetwork 这个库做网络请求,可以用以下代码去掉这个讨厌的空值

((AFJSONResponseSerializer*)manager.responseSerializer).removesKeysWithNullValues=YES;

经过如上设置,所有 NSNull 的值,都变成了 nil。
5、NullSafe
githhub上有一个Category,叫做NullSafe ,可以在运行时操作,把空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要把NullSafe.m加入到工程中就可以了,无需做其他操作,NullSafe会在运行时自动加载。详细的请去Github上查看:NullSafe
这里还有一个极简的封装方法:

#import"NSNull+OVNatural.h"
@implementationNSNull(OVNatural)
- (void)forwardInvocation:(NSInvocation *)invocation
{
if([selfrespondsToSelector:[invocation selector]]) {
[invocation invokeWithTarget:self];
}
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature *sig = [[NSNull class] instanceMethodSignatureForSelector:selector];
if(sig ==nil) {
sig = [NSMethodSignature signatureWithObjCTypes:"@^v^c"];
}
returnsig;
}
@end

关于[NSMethodSignature signatureWithObjCTypes:“@^vc”]的功能
可以参考以下两篇文章
Objective-C Runtime Programming Guide
Type Encodings

文中方法源自在网上看到的多种方法的整理,加入了一定自己的理解。如果有原创者看到麻烦告诉我,我会加上原博地址或者删除。

相关文章

网友评论

  • b56cc4b83e55:nullsafe这个库现在不存在了吧,好像删了,楼主还有这个库吗?可以私发一下吗
    Fiona_L:@b56cc4b83e55 你可以写一个对空值进行操作的,看看效果。
    b56cc4b83e55:看到了,但是怎么用呢?导入到工程里就可以了吗?我放到工程里感觉并没有什么变化啊
    Fiona_L:@b56cc4b83e55 https://github.com/nicklockwood/NullSafe
  • 来宝:为毛我加上(AFJSONResponseSerializer*)manager.responseSerializer).removesKeysWithNullValues=YES;这一句代码就崩呢?大神你用的是AFNetWorking3.0的还是2.0的?
    来宝:@Fiona_L 现在好了,是我放置的位置不正确
    Fiona_L:@来宝 pod的最新版本。崩溃时候显示的log是啥啊?

本文标题:Json中null的处理方法

本文链接:https://www.haomeiwen.com/subject/jkgglttx.html