zoukankan      html  css  js  c++  java
  • iOS 后台返回json解析出现的null的解决办法

    在后台返回值为Null为空时,我们代码没有判断时,程序就会崩溃。当时一直很疑惑是为啥,后来发现是数据问题,由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据。当我们通过一些第三方数据解析库解析数据后,就会是下图这种数据格式。null既不是字符串也不是nil所以我们有些判断是没用的。
    null

    解析成对象之后,如果直接向这个对象发送消息(length,count 等等)就会直接崩溃。提示错误为

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

    解决办法

    1.对取值对象类型判断。缺点是太过繁琐,每次都要写。

    #define kDictIsEmpty(dic) ([dic isKindOfClass:[NSNull class]])//宏
    
    if (![@"你要取的值" isKindOfClass:[NSNull class]]){
    //数据
    }
    

    2.字符串匹配。在获取到服务器返回的Json时(返回结果是string对象)通过stringByReplacingOccurrencesOfString方法,替换"null"为"空字符",然后解析。不过通过这个方法也有可能导致数据无法解析

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

    3.解析时把null 类型替换成nil。

    //有返回值的宏
    #define isToNull(value) 
    ({
       id tmp;
        if (![value isKindOfClass:[NSNull class]])
            tmp = value;
        else
            tmp = nil; 
        (tmp);
    })
    
    //调用方法
    label.text = isToNull(dic[@"data"]);
    

    4.如果使用是AFNetwork做网络请求的话,可以用以下代码,会自动去除空值

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
    response.removesKeysWithNullValues = YES;//去除空值
    manager.responseSerializer = response;//申明返回的结果是json类
    

    去除前

    去除前

    去除后 所有为空的键值对都不会自动去除

    去除后

    5.最有效而且简单的方法。使用国外一位大牛写的Category,叫做NullSafe ,在运行时操作,把空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。
    具体使用方法项目有说明

    NullSafe链接

  • 相关阅读:
    压测场景下的 TIME_WAIT 处理
    拥抱云原生,Fluid结合JindoFS :阿里云OSS加速利器
    从DHTML、HTC、XHTML到AJAX
    altas(ajax)控件(一):多功能面板控件Accordion
    fedora7 常用软件安装
    Fedora7安装后的配置
    .net程序员的盲点(六):StringBuilder 和 String 的区别
    .net程序员的盲点(五):告诉你一个不一样的new
    .net程序员的盲点(四):索引器Indexers
    员工究竟渴望学到的是什么?-(杂谈-20070816)
  • 原文地址:https://www.cnblogs.com/huanghaipo/p/7453086.html
Copyright © 2011-2022 走看看