美文网首页
后台返回null,导致崩溃

后台返回null,导致崩溃

作者: 没能唱给你的歌曲 | 来源:发表于2016-06-26 10:31 被阅读1306次

在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 类型的,所以可以直接判断是不是此类型:
if (![isKindOfClass:[NSNull class]]){xxxxxxx;}
因为字段实在太多,就找一个补一个。

  • 2、

后来想彻底解决这问题,就打算从数据源下手,其实应该可以用正则表达式匹配这个null ,然后进行替换,奈何正则是我的硬伤啊。于是就相出了一个山寨方法:字符串匹配。在获取到服务器返回的Json时,返回结果时string对象,于是就先替换 null 为 为空字符””,然后再解析。
json = [jsonStr stringByReplacingOccurrencesOfString:@":null" withString:@":"""];
这个方法本来很奏效,但是我这里的服务器返回极不简洁,各种垃圾数据(不吐槽这了)。。。反正这样会导致json无法解析了。

  • 3、

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

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

相关文章

  • 后台返回null,导致崩溃

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

  • iOS开发 全局处理后台崩溃

    处理后台返回回来的导致项目崩溃,新建 NullSafe.m文件 直接导入项目运行即可

  • ios 开发中的容错处理

    后台服务器返回给客户端的值有时会是null,有时会是"",直接赋值并进行后续操作有时会导致崩溃。 之前...

  • 关于后台返回null的崩溃处理

    由于后台会返回各种null,在使用过程中,如果不对null进行判断就直接使用,就经常会崩溃,判断方法可以使用 if...

  • runTime消息转发处理json中的null值

    后台服务器返回给客户端的值有时会是null,直接赋值并进行后续操作有时会导致崩溃。解决方法:1.写个工具类,判断处...

  • runTime消息转发处理json中的null值

    后台服务器返回给客户端的值有时会是null,直接赋值并进行后续操作有时会导致崩溃。解决方法:1.写个工具类,判断处...

  • 项目问题集锦(1)

    构造对象空指针问题 原因:接口没有返回uniq字段,导致构造函数某些属性为null,崩溃.[java.lang.I...

  • 后台返回null iOS

    1。第一种解决方案 就是在每一个 可能传回null 的地方 使用 if([object isEqual:[NSN...

  • Json 返回null崩溃

    想要解决服务器返回json失败问题,就先模拟一下失败场景如下图所示,我模拟了一个json,oneKey是字符串,t...

  • 关于手机横竖屏 fragment里的view空指针

    手机横竖屏时,fragment里的实例如recyclerview对象为null,后台返回数据时回调导致空指针异常。...

网友评论

      本文标题:后台返回null,导致崩溃

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