首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mantle中替换JSON空值

在Mantle中替换JSON空值
EN

Stack Overflow用户
提问于 2014-01-08 16:48:11
回答 3查看 3.8K关注 0票数 14

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

代码语言:javascript
复制
"fields": {

      "foobar": 41
    }

但是,有时foobar的值为空:

代码语言:javascript
复制
"fields": {

      "foobar": null
    }

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

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

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

代码语言:javascript
复制
+ (NSValueTransformer *)foobarJSONTransformer {
return [MTLValueTransformer transformerWithBlock:^id(id inObj) {
    if (inObj == [NSNull null]) {
        return [NSNumber numberWithInteger: -1];
    } else {
        return inObj;
    }
}];

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

捕获这种JSON null情况并进行替换的正确方法是什么?

EN

回答 3

Stack Overflow用户

发布于 2014-01-08 16:48:11

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

因此,解决方案是根据nil而不是NSNull来检查inObj

代码语言:javascript
复制
+ (NSValueTransformer *)foobarJSONTransformer {
return [MTLValueTransformer transformerWithBlock:^id(id inObj) {
    if (inObj == nil) {
        return [NSNumber numberWithInteger: -1];
    } else {
        return inObj;
    }
}];

然后,替换将按预期工作。

票数 7
EN

Stack Overflow用户

发布于 2014-01-08 16:53:22

如果您接收的是null,它将生成为NSNull。但是,如果他们missed这个字段或将其作为empty发送,它将在解析时生成为nil。所以你最好使用下面的代码

代码语言:javascript
复制
if (inObj == nil || inObj == [NSNull null] )
票数 7
EN

Stack Overflow用户

发布于 2016-03-04 18:16:45

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

代码语言:javascript
复制
- (void)setNilValueForKey:(NSString *)key {
    [self setValue:@0 forKey:key];
}

如果你的属性是oc对象,它将是空立即数,并且如果属性是整型、布尔型或浮点型,则不能执行它可以执行的method.but。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20990761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档