反序列化时忽略属性

新手上路,请多包涵

我有一个简单的接口,带有属性的 getter 和 setter。

 public interface HasMoney {

      Money getMoney();

      void setMoney(Money money);

 }

我有另一个实现此接口的类 UserAccount。

 public class UserAccount implements HasMoney {

       private Money money;

       @Override
       Money getMoney() // fill in the blanks

       @Override
       void setMoney(Money money) // fill in the blanks

}

我的问题是我想序列化 money 属性但在反序列化时忽略它,即不接受用户为此属性的任何值。我已经在 setter 上尝试了 @JsonIgnore,在 getter 上尝试了@JsonIgnore(false),它确实忽略了它,但它在序列化它的同时也忽略了它。

我在 setter 上尝试了 @JsonIgnore,在 getter 上尝试了@JsonProperty,只是为了明确地告诉 Jackson 我们打算跟踪这个属性,当 money 属性被发送到服务器并且 Jackson 试图反序列化它并抛出 MalformedJsonException 时,这似乎使应用程序崩溃:不能构造 Money 类型的对象。

最奇怪的是,将@JsonIgnore 放在setter 上并将@JsonProperty 放在setter 上适用于大多数情况下属性是原始的。

原文由 Nishant Nagwani 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 699
2 个回答

好的,所以 @JsonIgnore 的行为从 1.9 开始发生了根本性的变化(对于更糟糕的 imo)。无需深入了解为什么您的属性在反序列化过程中未被忽略的细节,请尝试使用以下代码修复它:

 public class UserAccount implements HasMoney {
    @JsonIgnore
    private BigDecimal money;

    // Other variable declarations, constructors

    @Override
    @JsonProperty
    public BigDecimal getMoney() {
        return money;
    }

    @JsonIgnore
    @Override
    public void setMoney(final BigDecimal money) {
        this.money = money;
    }

    // Other getters/setters
}

请注意在现场使用 @JsonIgnore - 它是工作解决方案所必需的。

注意:根据您的环境和用例,您可能需要在 ObjectMapper 实例上进行额外配置,例如 USE_GETTERS_AS_SETTERS、AUTO_DETECT_GETTERS、AUTO_DETECT_SETTERS _等_。

原文由 Perception 发布,翻译遵循 CC BY-SA 4.0 许可协议

版本 2.6.0+ 允许在类级别使用 @JsonIgnoreProperties 完成此操作。

 @JsonIgnoreProperties(value={ "money" }, allowGetters=true)

看看这个已关闭的问题: https ://github.com/FasterXML/jackson-databind/issues/95

原文由 kmek 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题