使用Jackson将JSON反序列化为带有重载方法的对象

我试图反序列化存储在CouchDb使用jackson的JSON对象。 这个对象需要反序列化成包含重载方法的pojo。 当我试图从沙发上检索对象并进行反序列化时,我得到以下exception:

org.ektorp.DbAccessException:org.codehaus.jackson.map.JsonMappingException:属性“multiplier”的setter定义冲突:com.db.commodities.framework.sdos.model.security.EqOpt#setMultiplier(1 params)vs com.db .commodities.framework.sdos.model.security.EqOpt#setMultiplier(1 params)

我试图诠释我想让jackson使用的二传手,但是这似乎没有奏效。

@JsonProperty("multiplier") public void setMultiplier(SDOSAttribute multiplier) { this.multiplier = multiplier; } public void setMultiplier(double multiplier) { this.multiplier.setValue(String.valueOf(multiplier)); } 

如何configurationJackson使用特定方法正确反序列化? 还是我以错误的方式处理这个问题?

编辑:

我做了以下更改。 这似乎工作,但有点丑陋。 如果有人有更好的办法做到这一点,请随时分享,我会很乐意接受。

 @JsonProperty("multiplier") protected void setMultiplierAttribute(SDOSAttribute multiplier) { this.multiplier = multiplier; } @JsonIgnore public void setMultiplier(double multiplier) { this.multiplier.setValue(String.valueOf(multiplier)); } 

不需要改变setter方法的名字以避免模糊。 你在@JsonIgnore正确的轨道上。 使用@JsonIgnore对所有相同名称的方法进行忽略,使用的方法不需要@JsonProperty注释。

这里有一个简单的例子来说明这一点。

input.json: {"value":"forty-two"}

Foo.java:

 import java.io.File; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.map.ObjectMapper; public class Foo { String value; public String getValue() {return value;} public void setValue(String value) {this.value = value;} @JsonIgnore public void setValue(int value) {this.value = String.valueOf(value);} public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); Foo foo = mapper.readValue(new File("input.json"), Foo.class); System.out.println(mapper.writeValueAsString(foo)); } } 

如果你不想用Jackson注解来改变原始的POJO,那么你可以使用MixIn

 import java.io.File; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.map.ObjectMapper; public class Foo { String value; public String getValue() {return value;} public void setValue(String value) {this.value = value;} public void setValue(int value) {this.value = String.valueOf(value);} public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.getDeserializationConfig().addMixInAnnotations(Foo.class, IgnoreFooSetValueIntMixIn.class); Foo foo = mapper.readValue(new File("input.json"), Foo.class); System.out.println(mapper.writeValueAsString(foo)); } } abstract class IgnoreFooSetValueIntMixIn { @JsonIgnore public abstract void setValue(int value); } 

在Jackson> 2.4中直接使用:

 mapper.addMixIn(Foo.class, IgnoreFooSetValueIntMixIn.class); 

在@JsonIgnore没有帮助的情况下(我目前有这种情况,但是仍然不确定原因),也可以使用@XmlTransient。