Могу ли я получить afnetworking для автоматического анализа null до nil?

StackOverflow https://stackoverflow.com//questions/10694404

  •  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;
.

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top