在 Mantle 中替换 JSON 空值

Posted

技术标签:

【中文标题】在 Mantle 中替换 JSON 空值【英文标题】:Substituting JSON null values in Mantle 【发布时间】:2014-01-08 08:48:11 【问题描述】:

我正在使用 Mantle 解析一些通常如下所示的 JSON:

"fields": 

      "foobar": 41
    

但有时 foobar 的值为 null:

"fields": 

      "foobar": null
    

这会导致 MTLValidateAndSetValue 在尝试通过键值编码设置 nil 值时抛出异常。

我想做的是检测这个空值的存在并将其替换为 -1。

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

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

【问题讨论】:

【参考方案1】:

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

所以解决方案是检查inObjnil,而不是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,并覆盖blow code:

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

如果你的属性是oc对象,它会立即为nil,并且不能执行方法。但是如果属性是int,bool或float,它可以执行。

【讨论】:

以上是关于在 Mantle 中替换 JSON 空值的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3.2:用json序列化中的空字符串替换空值

IOS,如何在数组中的 dic 中循环 dic 以替换空字符串的空值

pandas 怎么处理表格中的空值

MS ACCESS 2016 - 使用 Null 进行查询的标准

那些年我们踩过的坑,SQL 中的空值陷阱!

go数组