一尘不染

反序列化时忽略属性

json

我有一个简单的接口与属性的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放在设置器上,将@JsonProperty放在设置器上是可行的。


阅读 312

收藏
2020-07-27

共1个答案

一尘不染

好的,因此@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

2020-07-27