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

新手上路,请多包涵

我正在尝试使用 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));
}

原文由 gregwhitaker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 723
2 个回答

不必更改 setter 方法的名称以避免歧义。否则你在正确的轨道上 @JsonIgnore 。使用 @JsonIgnore 忽略所有同名方法,使用的方法不需要 @JsonProperty 注释。

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

输入.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 defs,则可以使用 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);
}

原文由 Programmer Bruce 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 Jackson > 2.4 中直接使用:

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

原文由 gribo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题