Json中null的处理方法

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

"somevalue":null

通过JsonKit 这个第三方库解析出来的数据就成了
somevalue = "";
这个数据类型不是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

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

你可能感兴趣的:(Json中null的处理方法)