Могу ли я получить afnetworking для автоматического анализа null до nil?
-
12-12-2019 - |
Вопрос
Мы используем AfnetWorking в нашем мобильном приложении, и много раз у нас пришло JSON, что имеет значение для некоторых значений.
Я устаю делать следующее.
if ([json objectForKey:@"nickname"] isKindOfClass:[NSNull class]]) {
nickname = nil;
} else {
nickname = [json objectForKey:@"nickname"];
}
.
Что-нибудь, что мы можем сделать, чтобы сделать AfnetWorking Automagically Set объекты в Nil или номера до 0, если значение NULL в ответе JSON?
Решение
Это на самом деле невозможно, поскольку словарь не может содержать nil
в качестве объекта для ключа.Ключ должен быть остановлен полностью, чтобы получить поведение, которое вы хотите, что было бы нежелательным по-своему.
Предположим, у вас не было контроля над данными, которые вы получаете, и не знали, какие ключи присутствовали в JSON.Если вы хотите перечислить их все, или отобразить их в таблице, и клавиши для нулевых объектов были оставлены из словаря, вы сможете увидеть неверный список.
NSNull
- это «нет» заполнителя для коллекций какао, и поэтому он используется в этом случае.
Вы можете сделать вашу печатать немного проще с макросом:
#define nilOrJSONObjectForKey(JSON_, KEY_) [[JSON_ objectForKey:KEY_] isKindOfClass:[NSNull class]] ? nil : [JSON_ objectForKey:KEY_]
nickname = nilOrJSONObjectForKey(json, @"nickname");
. Другие советы
Вы можете установить флаг SetremoVESKEYSWITHNULLULLUTS, чтобы да в AFHTTPSIOLMANAGER RESPING SERIALIZER:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:url sessionConfiguration:config];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
[serializer setRemovesKeysWithNullValues:YES];
[manager setResponseSerializer:serializer];
. Ответ DV_ отлично работает для AfthtpsessionManager.Но если вы используете AFHTTPREQUESTOPERATER вместо менеджера, попробуйте это:
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
serializer.removesKeysWithNullValues = YES;
op.responseSerializer = serializer;
. Есть один красивый cocoapod, называемый minced https://github.com/hyperoslo/minced , которые могутСделайте то, что может помочь вам обрабатывать нулевые от ответа JSON.Вместо нуль он ставит пустую строку.
Если вы замените Nsjsonserization по умолчанию с SBJSON, это решит вашу проблему.
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;
.
}