Подтвердить что ты не робот

Подстановка нулевых значений JSON в Mantle

Я использую Mantle для разбора некоторого JSON, который обычно выглядит следующим образом:

"fields": {

      "foobar": 41
    }

Однако иногда значение foobar равно null:

"fields": {

      "foobar": null
    }

Это приводит к тому, что MTLValidateAndSetValue генерирует исключение, пытаясь установить значение nil с помощью кодирования по значению ключа.

То, что я хотел бы сделать, это обнаружить наличие этого нулевого значения и заменить его на -1.

Я попытался переопределить foobarJSONTransformer в моем подклассе MTLModel следующим образом:

+ (NSValueTransformer *)foobarJSONTransformer {
return [MTLValueTransformer transformerWithBlock:^id(id inObj) {
    if (inObj == [NSNull null]) {
        return [NSNumber numberWithInteger: -1];
    } else {
        return inObj;
    }
}];

... и я вижу, что этот код вызывается, но inObj никогда не равен [NSNull null], поэтому подстановка не выполняется, и исключение все еще выбрано мантией.

Каков правильный способ поймать этот случай JSON null и сделать замену?

4b9b3361

Ответ 1

Я неправильно предположил, что NSNull будет сгенерирован для нулевого значения JSON. Фактически он анализируется значением nil.

Итак, решение состоит в проверке inObj на nil, а не на NSNull:

+ (NSValueTransformer *)foobarJSONTransformer {
return [MTLValueTransformer transformerWithBlock:^id(id inObj) {
    if (inObj == nil) {
        return [NSNumber numberWithInteger: -1];
    } else {
        return inObj;
    }
}];

подстановка будет работать, как ожидалось.

Ответ 2

Если вы получили как null, он будет создан как NSNull. Но если они missed это поле или отправят его как empty, он будет генерировать как nil во время разбора. поэтому лучше вы можете использовать ниже код

if (inObj == nil || inObj == [NSNull null] )

Ответ 3

создать базовую модель и наследовать MTLModel и переопределить код:

- (void)setNilValueForKey:(NSString *)key {
    [self setValue:@0 forKey:key];
}

Если вы являетесь объектом oc, он будет nil немедленным и не сможет выполнить метод. но он может выполняться, если свойство является int, bool или float.