使用杰克逊组成而不是继承

时间:2015-10-30 10:25:41

标签: 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();
    }
}

我知道我可以创建一个自定义序列化器/解串器,但我希望有一种方法可以避免它并让杰克逊完成所有工作。

我觉得这样做不应该这么难。我错过了杰克逊的一些技巧/注释吗?我很感激你的帮助。

1 个答案:

答案 0 :(得分:0)

@JsonUnwrapped 可用于组合。

Person 的序列化

    public class Person {
      public int age;
      @JsonUnwrapped
      public Name name;
    }

生成以下 JSON。

    {
      "age" : 18,
      "first" : "John",
      "last" : "Doe"
    }

参考文献: