反序列化时忽略属性

2022-08-31 20:28:17

我有一个简单的接口,带有属性的 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 上,当属性是基元时,在大多数情况下都是有效的。


答案 1

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

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

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


答案 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