java - Jackson:基于实现接口(interface)的对象身份序列化/反序列化

标签 java jackson jackson2

interface Foo
  public String key()

class Bar implements Foo
  public int id;
  public String name;
  public Bar2 bar2;  <--- bar2.key() should be used as json value
  String key() { return name }

class Bar2 implements Foo
  public int id;
  public int name;
  public Bar bar;  <--- bar.key() should be used as json value
  String key() { return name }

每当在序列化中引用Foo类型的任何对象时,它的值都应该是object.key()。 对于反序列化,应该使用 to 的值来查找实际对象(BarBar2 等)

jackson 如何做到这一点?

最佳答案

您需要公共(public)属性的 getter 方法。将 Foo 更改为抽象类并在其中定义属性和 getter 方法。

public abstract class Foo implements Serializable{
    public String name;
    public Foo bar;

    public Foo() {
    }

    public String getBar(){
        return bar.name;
    }

    public void setBar(Foo bar) {
        this.bar = bar;
    }
}

class Bar extends Foo{
    public int id;

    public Bar() {
    }

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        Bar bar = new Bar();
        Bar2 bar2 = new Bar2();
        bar.id = 1; bar.name = "bar1";bar.setBar(bar2);
        bar2.id = 2; bar2.name = "bar2"; bar2.setBar(bar);

        System.out.println(mapper.writeValueAsString(bar));
    }
}

public class Bar2 extends Foo {
    public int id;

    public Bar2() {
    }
}

关于java - Jackson:基于实现接口(interface)的对象身份序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41671872/

相关文章:

java - 为什么 Jackson 的 ObjectMapper 方法采用原始 TypeReference

java - 在 Java 下创建进程变慢?

Java ArrayList 覆盖

Java - 使用 Jackson 转换为正确的 json 格式

java - 反序列化期间重复的字段

java - 具有不常见 getter 方法名称的序列化中的 Jackson 命名约定问题

java - JJWT/Jackson 改变了使用的 ObjectMapper

java - 将 sql 参数传递给 jdbcTemplate.query 时,我收到带有对象参数的 SQLException

java - 配置单元 : Merge two maps into one column

java - 使用 Jackson JSON Mapper 在 JSON 到 POJO 之间映射时出现 400 错误请求