在Mantle中替换JSON空值

时间:2014-01-08 08:48:11

标签: ios json github-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],因此替换不会发生,并且Mantle仍会抛出异常。

捕获此JSON null case并进行替换的正确方法是什么?

3 个答案:

答案 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,它可以执行。