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

如何解决使用Jackson使用重载方法将JSON反序列化为对象?

开发过程中遇到使用Jackson使用重载方法将JSON反序列化为对象的问题如何解决?下面主要结合日常开发的经验,给出你关于使用Jackson使用重载方法将JSON反序列化为对象的解决方法建议,希望对你解决使用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));
}

编程问答问答

在 CSS 中设置 cellpadding 和 cellspacing?
如何在 Java 中创建内存泄漏?
浮点数被破坏了吗?
按字符串属性值对对象数组进行排序
如何加快Android模拟器的速度?
如何舍入至多 2 位小数?
使用 Git 版本控制查看文件的更改历史记录
如何在 JavaScript 中检查空/未定义/空字符串?
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注