我可以让 AFNetworking 自动将 NULL 解析为 nil 吗?
-
12-12-2019 - |
题
我们在移动应用程序中使用 AFNetworking,很多时候我们会返回 JSON,其中某些值为 null。
我厌倦了做以下事情。
if ([json objectForKey:@"nickname"] isKindOfClass:[NSNull class]]) {
nickname = nil;
} else {
nickname = [json objectForKey:@"nickname"];
}
如果 JSON 响应中的值为 null,我们可以做些什么来使 AFNetworking 自动将对象设置为 nil 或将数字设置为 0?
解决方案
这实际上是不可能的,因为字典不能包含 nil
作为键的对象。为了获得您想要的行为,必须完全省略该键,这本身就是不可取的。
假设您无法控制所接收的数据,并且不知道 JSON 中存在哪些键。如果您想列出所有对象,或者将它们显示在表中,并且空对象的键被排除在字典之外,您将看到一个不正确的列表。
NSNull
是 Cocoa 集合的“无”占位符,这就是在本例中使用它的原因。
您可以使用宏使您的输入更轻松一些:
#define nilOrJSONObjectForKey(JSON_, KEY_) [[JSON_ objectForKey:KEY_] isKindOfClass:[NSNull class]] ? nil : [JSON_ objectForKey:KEY_]
nickname = nilOrJSONObjectForKey(json, @"nickname");
其他提示
您可以将标志SetRemoveSkeysWithNullValues在AFHTTPSESSIONMANGER响应序列化程序中设置为YES:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:url sessionConfiguration:config];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
[serializer setRemovesKeysWithNullValues:YES];
[manager setResponseSerializer:serializer];
. dv_的答案适用于afhttpsessionManager。但如果您使用的是使用AFHTTPREQUESTOPERATION而不是经理,请尝试:
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
serializer.removesKeysWithNullValues = YES;
op.responseSerializer = serializer;
. 有一个漂亮的cocoapod称cined https://github.com/hyperoslo/minced 可以做一些可以帮助您从JSON响应处理NULL的内容。而不是null它放空字符串。
如果用sbjson替换默认的nsjsonserialization,它将解决您的问题。
sbjson使对象nil而不是nsjsonserialization的选择“null”
查看您可以使用的不同JSON解析器的要求。 https://github.com/afnetworking/afnetworking#requirements
您可以在此功能自定义AFnetworking。将任何值设置为null
的对象static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) {
if ([JSONObject isKindOfClass:[NSArray class]]) {
NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]];
for (id value in (NSArray *)JSONObject) {
[mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)];
}
return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray];
} else if ([JSONObject isKindOfClass:[NSDictionary class]]) {
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject];
for (id <NSCopying> key in [(NSDictionary *)JSONObject allKeys]) {
id value = (NSDictionary *)JSONObject[key];
if (!value || [value isEqual:[NSNull null]]) {
// custom code here
//[mutableDictionary removeObjectForKey:key];
[mutableDictionary setObject:@"" forKey:key];
} else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) {
mutableDictionary[key] = AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions);
}
}
return (readingOptions & NSJSONReadingMutableContainers) ? mutableDictionary : [NSDictionary dictionaryWithDictionary:mutableDictionary];
}
return JSONObject;
.
}