美文网首页
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);
        }];
    
    • 完结

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

    相关文章

      网友评论

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

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