Подстановка нулевых значений 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 и сделать замену?
Ответы
Ответ 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.