14

我正在使用 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 情况并进行替换的正确方法是什么?

4

3 回答 3

7

我错误地假设NSNull会为空 JSON 值生成。实际上它被解析为一个nil值。

所以解决方案是检查,inObjnil不是NSNull

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

然后替换将按预期工作。

于 2014-01-08T08:48:11.227 回答
7

如果您收到 as null,它将生成 as NSNull。但是如果他们missed将此字段或发送为empty,它将nil在解析时生成。所以更好的是你可以使用下面的代码

if (inObj == nil || inObj == [NSNull null] )
于 2014-01-08T08:53:21.570 回答
1

创建一个基础模型并继承MTLModel,并覆盖blow代码:

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

如果您的属性是 oc 对象,它将立即为零,并且无法执行该方法。但如果属性是 int、bool 或 float,它可以执行。

于 2016-03-04T10:16:44.623 回答