我正在使用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]
,因此替换不会发生,并且Mantle仍会抛出异常。
捕获此JSON null case并进行替换的正确方法是什么?
答案 0 :(得分:7)
我错误地认为将为空JSON值生成NSNull
。实际上它被解析为nil
值。
因此解决方案是针对inObj
检查nil
,而不是NSNull
:
+ (NSValueTransformer *)foobarJSONTransformer {
return [MTLValueTransformer transformerWithBlock:^id(id inObj) {
if (inObj == nil) {
return [NSNumber numberWithInteger: -1];
} else {
return inObj;
}
}];
然后,替换将按预期工作。
答案 1 :(得分:7)
如果您收到null
,则会生成NSNull
。但如果他们missed
此字段或将其作为empty
发送,则在解析时会生成nil
。所以你可以使用下面的代码
if (inObj == nil || inObj == [NSNull null] )
答案 2 :(得分:1)
创建基础模型并继承MTLModel,并覆盖打击代码:
- (void)setNilValueForKey:(NSString *)key {
[self setValue:@0 forKey:key];
}
如果你的属性是oc对象,它将是nil,并且不能执行该方法。但是如果属性是int,bool或float,它可以执行。