如何解决使用Jackson使用重载方法将JSON反序列化为对象
不必更改setter方法的名称即可避免歧义。否则,您在正确的轨道上@JsonIgnore
。由于@JsonIgnore
所有同名方法都将被忽略,因此使用的方法不需要@JsonProperty
注释。
这是一个简单的例子来说明这一点。
{"value":"forty-two"}
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来反序列化存储在CouchDb中的JSON对象。该对象需要反序列化为包含重载方法的pojo。当我尝试从沙发上检索对象并进行反序列化时,出现以下异常:
org.ektorp.DbAccessException:org.codehaus.jackson.map.JsonMappingException:属性“乘数”的设置器定义冲突:com.db.commodities.framework.sdos.model.security.EqOpt#setMultiplier(1
params)vs com.db
.commodities.framework.sdos.model.security.EqOpt#setMultiplier(1个参数)
我试图注释我想让杰克逊使用的二传手,但这似乎没有用。
@JsonProperty("multiplier")
public void setMultiplier(SDOSAttribute multiplier) {
this.multiplier = multiplier;
}
public void setMultiplier(double multiplier) {
this.multiplier.setValue(String.valueOf(multiplier));
}
如何配置Jackson以使用特定方法正确地反序列化?还是我以错误的方式来解决这个问题?
编辑:
我进行了以下更改。这似乎可行,但是有点难看。如果有人有更好的方法来进行此操作,请随时分享,我会很乐意接受。
@JsonProperty("multiplier")
protected void setMultiplierAttribute(SDOSAttribute multiplier) {
this.multiplier = multiplier;
}
@JsonIgnore
public void setMultiplier(double multiplier) {
this.multiplier.setValue(String.valueOf(multiplier));
}