美文网首页
iOS 处理服务器返回数据中的null

iOS 处理服务器返回数据中的null

作者: 邓布利多教授 | 来源:发表于2020-03-18 11:18 被阅读0次

最近经常被服务器返回的数据搞的头昏脑涨,一度想要约后台同事切磋武艺!

类似服务器返回数据中带有null的情况,在以前也是时有发生,奈何当时基于自己的懒惰和对后台同事的信赖,一直对这个该死的null视而不理。现如今,越来越多的null出现在控制台,后台同事对我一次次的伤害,我的宝贝程序一次次的在我面前崩溃到死去活来。
我真的是忍不了了,这个问题,我不能再容许它的出现了,必须得解决……

  • 解决思路

在服务器返回数据的位置,Json解析之后立刻处理,处理完成之后,再正式回调数据。
服务器返回的数据类型,对于iOS来说,我可以把它分成字符串字典数组其他四种类型,然后分别对四种类型做处理。处理的中心思想是,'n'、'u'、'l'这个三个字母和NSNull这个类型。至少目前,我只想解决这类相关的问题,至于其他的问题,还有待发现,或者有过类似经验的朋友在下方评论区留言。

  • 方案实施

服务器返回的Json数据,大部分情况下,我们必然要解析成一个字典,而且,字典中又可能嵌套着字典或者数组,总之类似这种相互嵌套的情况必定会存在,所以,针对字典数组做处理就OK了。我这里,分别给字典数组添加了对应的分类,下面直接贴代码,代码中有注释,解决方案和编写的代码或许会很low,但至少是一种处理办法,欢迎有更好的解决方案的朋友指点指点。

  • 字典分类.h文件
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSDictionary (LYNull)

-(NSDictionary *)dictionaryReplaceNullByString;

@end

NS_ASSUME_NONNULL_END
  • 字典分类.m文件
#import "NSDictionary+LYNull.h"
#import "NSArray+LYNull.h"

@implementation NSDictionary (LYNull)

-(NSDictionary *)dictionaryReplaceNullByString{
    
    NSMutableDictionary *mutDictionary = [self mutableCopy];
    
    //遍历字典中的key
    for (NSString *key in self) {
        
        //因为不清楚value的类型,所以定义一个万能id类型
        id value = self[key];
        
        //判断value的类型是字符串
        if ([value isKindOfClass:[NSString class]]) {
            
            //遇到该死的null替换成""
            if ([value isEqualToString:@"<null>"] ||
                [value isEqualToString:@"NSNull"] ||
                [value isEqualToString:@"null"] ||
                [value isEqualToString:@"NULL"] ||
                [value isEqualToString:@"Null"]) {
                [mutDictionary setValue:@"" forKey:key];
            }
            
        }
        
        //判断value的类型是字典,继续调用一遍解析
        else if ([value isKindOfClass:[NSDictionary class]]) {
            [mutDictionary setValue:[value dictionaryReplaceNullByString] forKey:key];
        }
        
        //判断value的类型是数组,调用数组的容错方法
        else if ([value isKindOfClass:[NSArray class]]) {
            [mutDictionary setValue:[value arrayReplaceNullByString] forKey:key];
        }
        
        //判断value的类型是对象
        else{
            
            //定义一个id类型对象,如果是该死的NSNull类型替换成""
            id null = [NSNull null];
            if (value == null || [value isEqual:[NSNull class]]) {
                [mutDictionary setValue:@"" forKey:key];
            }
            
        }
    }
    
    //把处理的最终结果返回回去
    return (NSDictionary *)[mutDictionary copy];

}

@end

  • 数组分类.h文件
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSArray (LYNull)

-(NSArray *)arrayReplaceNullByString;

@end

NS_ASSUME_NONNULL_END
  • 数组分类.m文件
#import "NSArray+LYNull.h"
#import "NSDictionary+LYNull.h"

@implementation NSArray (LYNull)

-(NSArray *)arrayReplaceNullByString{
    
    NSMutableArray *mutArray = [self mutableCopy];
    
    //遍历数组中的元素
    for (int idx = 0; idx < mutArray.count; idx ++) {
        
        //因为不清楚value的类型,所以定义一个万能id类型
        id value = mutArray[idx];
        
        //判断value的类型是字符串
        if ([value isKindOfClass:[NSString class]]) {
            
            //遇到该死的null替换成""
            if ([value isEqualToString:@"<null>"] ||
                [value isEqualToString:@"NSNull"] ||
                [value isEqualToString:@"null"] ||
                [value isEqualToString:@"NULL"] ||
                [value isEqualToString:@"Null"]) {
                [mutArray replaceObjectAtIndex:idx withObject:@""];
            }
            
        }
        
        //判断value的类型是字典,调用字典的容错方法
        else if ([value isKindOfClass:[NSDictionary class]]){
            [mutArray replaceObjectAtIndex:idx withObject:[value dictionaryReplaceNullByString]];
        }
        
        //判断value的类型是数组,继续调用一遍解析
        else if ([value isKindOfClass:[NSArray class]]) {
            [mutArray replaceObjectAtIndex:idx withObject:[value arrayReplaceNullByString]];
        }
        
        //判断value的类型是对象
        else{
            
            //定义一个id类型对象,如果是该死的NSNull类型替换成""
            id null = [NSNull null];
            if (value == null || [value isEqual:[NSNull class]]) {
                [mutArray replaceObjectAtIndex:idx withObject:@""];
            }
            
        }
        
    }
    
    //把处理的最终结果返回回去
    return (NSArray *)[mutArray copy];
    
}

@end

  • 方法调用

调用也是很简单,就是对Json解析之后直接处理,亲测完美有效。

[requestGet GET:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSDictionary *dict = [[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil] dictionaryReplaceNullByString];
        if (dict) {
            NSLog(@"请求方式:GET \n请求地址:%@ \n请求回调信息:\n%@",requestUrlStr,[LYTools dataToJsonString:dict]);
            success(dict,YES);
        }else{
            success(dict,NO);
        }
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error = %@",error);
        failure(error);
    }];
  • 完结

可能有其他情况没考虑到,欢迎指出,谢谢

相关文章

  • nil,Nil,null,NSNull的区别

    各自的含义: iOS开发服务器返回(null) 与的处理

  • iOS 处理服务器返回数据中的null

    最近经常被服务器返回的数据搞的头昏脑涨,一度想要约后台同事切磋武艺!类似服务器返回数据中带有null的情况,在以前...

  • 关于ios “<null>”的异常处理

    在iOS开发过程中需要与服务器进行数据通讯,但是问题来了,接口返回的数据中会出现:null ""等问题...

  • python中的Nonetype如何处理

    当python处理数据库中返回的字段值时,数据库中的字段值为"NULL",这个"NULL"返回给python程序怎...

  • NSNull & nil & Nil & NULL & Nul

    关于iOS开发中服务器返回null引起的崩溃,我想凡是iOS开发者都应该遇到过上述问题。对null值的处理大家想必...

  • iOS 处理后台返回Json数据中处理方案

    iOS小伙伴在开发中进行网络请求数据时,接口可能返回字段为:然后渲染在Label上面就很不适应,如下图...

  • 后台返回数据-<null>-(null)-nil

    后台数据的特殊情况 iOS开发中可能遇到的后台错误数据一般有两种 以及 (null) 数据返回流程:...

  • 使用AFN去掉 Null

    服务器有可能返回 null 数据,iOS会自动帮我们转成 NSNull 对象,直接进行归档就会失败 使用 AFNe...

  • ios 判断服务器返回null

    服务器有时候会返回null,这对应ios开发者来说是很坑的一件事,因为这样程序会崩溃;去除服务器返回null,代码...

  • 数据处理

    1、处理返回数据中null 在开发中有时候后台返回的json数据格式不规范,如图所示,可能对我们APP开发解析数据...

网友评论

      本文标题:iOS 处理服务器返回数据中的null

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