【问题标题】:Substituting JSON null values in Mantle在 Mantle 中替换 JSON 空值
【发布时间】: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 情况并进行替换的正确方法是什么?

【问题讨论】:

    标签: ios json github-mantle


    【解决方案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,它可以执行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-12
          • 2017-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多