我们在移动应用程序中使用 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;
.

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top