在Mantle中替换JSON空值

And*_*ing 14 json ios github-mantle

我正在使用Mantle来解析一些通常看起来像这样的JSON:

"fields": {

      "foobar": 41
    }
Run Code Online (Sandbox Code Playgroud)

但是有时foobar的值为null:

"fields": {

      "foobar": null
    }
Run Code Online (Sandbox Code Playgroud)

这会导致MTLValidateAndSetValue抛出异常,因为它试图通过键值编码设置nil值.

我想要做的是检测此null值的存在并用-1替换它.

我尝试覆盖foobarJSONTransformer我的MTLModel子类,如下所示:

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

...我可以看到这个代码被调用但是inObj永远不会等于[NSNull null],因此替换不会发生,并且Mantle仍然抛出异常.

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

And*_*ing 7

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

因此,解决办法是检查inObj对抗nil,而不是NSNull:

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

然后替换将按预期工作.


Man*_*ani 7

如果您收到null,则会生成为NSNull.但是如果他们将missed这个字段或者发送给它empty,它将nil在解析时生成.所以你可以使用下面的代码

if (inObj == nil || inObj == [NSNull null] )
Run Code Online (Sandbox Code Playgroud)