java - 使用 Jackson 组合而不是继承

标签 java json inheritance jackson composition

我正在尝试使用 Jackson 来为我管理类型,但我想使用组合而不是使用继承来创建类型,并拥有一组带有一些注释的工厂方法,这些注释将指示 Jackson 这些是什么类型。具体例子:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
public interface MyInterface {
    void doStuff();

    // Factories

    @JsonCreator
    @JsonSubTypes.Type(value = MyInterface.class, name = "impl1")
    static MyInterface impl1() {
        return new MyInterfaceWithComposition(() -> System.out.println("Impl1"));
    }

    @JsonCreator
    @JsonSubTypes.Type(value = MyInterface.class, name = "impl2")
    static MyInterface impl2() {
        return new MyInterfaceWithComposition(() -> System.out.println("Impl2"));
    }
}

public class MyInterfaceWithComposition implements MyInterface {
    private final Runnable task;

    public MyInterfaceWithComposition(Runnable task) {
        this.task = task;
    }

    @Override
    public void doStuff() {
        task.run();
    }
}

我知道我可以创建自定义序列化器/反序列化器,但我希望有一种方法可以避免它并使 Jackson 完成所有工作。

在我看来,做这件事不应该这么难。我错过了一些 jackson 技巧/注释吗?我很感激你的帮助。

最佳答案

@JsonUnwrapped 可用于合成。Person 的序列化

    public class Person {
      public int age;
      @JsonUnwrapped
      public Name name;
    }
生成以下 JSON。
    {
      "age" : 18,
      "first" : "John",
      "last" : "Doe"
    }
引用:
  • https://github.com/FasterXML/jackson-databind/blob/jackson-databind-2.12.3/src/test/java/com/fasterxml/jackson/databind/struct/TestUnwrapped.java#L168
  • 关于java - 使用 Jackson 组合而不是继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33433750/

    相关文章:

    java - requestPermissions() 什么都不做

    java - 从包含周名和时间的字符串中解析时间

    javascript - 使用 node.js 将多维数组转换为 JSON

    php - 如何插入 php 代码以防止在 mysql 中重复输入?

    java - 创建子类的两种方法实际上是相同的?

    JavaFX:可编辑 TextFieldTableCell 中的异常处理

    java - 在 Java 构建路径上找不到父类(super class) "javax.servlet.http.HttpServlet"

    python - 如何存储查询结果(使用 Python)

    javascript - 在 jQuery 扩展对象中从父级调用子级方法

    c++ - 一个类可以有虚拟数据成员吗?