反序列化时忽略属性

我有一个简单的接口,带有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上并且setter上的@JsonProperty适用于大多数情况下属性是原始的。

好的,所以@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

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

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

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