在 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
值。
所以解决方案是检查inObj
和nil
,而不是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 空值的主要内容,如果未能解决你的问题,请参考以下文章
IOS,如何在数组中的 dic 中循环 dic 以替换空字符串的空值