我可以让AFNetworking自动将NULL解析为nil吗?

bir*_*rda 22 objective-c ios afnetworking

我们在我们的移动应用程序中使用AFNetworking,很多时候我们会让JSON返回某些值为null.

我厌倦了做以下事情.

if ([json objectForKey:@"nickname"] isKindOfClass:[NSNull class]]) {
    nickname = nil;
} else {
    nickname = [json objectForKey:@"nickname"];
}
Run Code Online (Sandbox Code Playgroud)

如果JSON响应中的值为null,我们可以做些什么来使AFNetworking自动将对象设置为nil或数字为0?

DV_*_*DV_ 30

您可以在AFHTTPSessionManager响应序列化程序中将标志setRemovesKeysWithNullValues设置为YES:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:url sessionConfiguration:config];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
[serializer setRemovesKeysWithNullValues:YES];
[manager setResponseSerializer:serializer];
Run Code Online (Sandbox Code Playgroud)


Jos*_*ell 21

这不太可能,因为字典不能包含nil作为密钥的对象.必须完全省略密钥以获得您想要的行为,这本身就是不受欢迎的.

假设您无法控制所接收的数据,并且不知道JSON中存在哪些键.如果要将它们全部列出,或者将它们显示在表中,并且将空对象的键留在字典之外,则会看到不正确的列表.

NSNull 是Cocoa集合的"无"占位符,这就是它在这种情况下使用的原因.

您可以使用宏使您的输入更容易:

#define nilOrJSONObjectForKey(JSON_, KEY_) [[JSON_ objectForKey:KEY_] isKindOfClass:[NSNull class]] ? nil : [JSON_ objectForKey:KEY_]

nickname = nilOrJSONObjectForKey(json, @"nickname");
Run Code Online (Sandbox Code Playgroud)