最近经常被服务器返回的数据搞的头昏脑涨,一度想要约后台同事切磋武艺!
类似服务器返回数据中带有
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);
}];
-
完结
可能有其他情况没考虑到,欢迎指出,谢谢
网友评论