我试图反序列化存储在CouchDb使用Jackson的JSON对象。此对象需要反序列化为包含重载方法的pojo。当我尝试从沙发中检索对象并做反序列化时,我得到以下异常:
org.ektorp.DbAccessException:
org.codehaus.jackson.map.JsonMappingException:
Conflicting setter definitions for
property “multiplier”:
com.db.commodities.framework.sdos.model.security.EqOpt#setMultiplier(1
params) vs
com.db.commodities.framework.sdos.model.security.EqOpt#setMultiplier(1
params)
我试图注释安装程序我想杰克逊使用,但似乎没有工作。
@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));
}
最佳答案
没有必要更改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));
}
}
如果你不想改变原始的POJO defs与Jackson注释,那么你可以使用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将Java对象序列化为JSON时,抑制包装器对象
- java - Jackson Json将对象反序列化为列表
- java - 使用Jackson和WebClient将json数组反序列化为对象
- java - 使用hibernate jpa进行JSON序列化和反序列化,以便在JSON响应中将父对象转换为子对象
- java - 使用Jackson定制JSON反序列化
- java - 如何在使用Jackson将对象序列化为JSON时避免@type中的类名
- java - Jackson:使用嵌套对象将对象上的JSON序列化为JSON,将子字段合并到拥有类中
- java - Jackson:反序列化递归对象
转载注明原文:java – 使用Jackson重载JSON方法将JSON反序列化为对象 - 代码日志