7

我在超类中有许多具有一组共享属性的对象:

public Superclass {
    int id;
    String name;
    ...
}

而且我有从超类继承的子类,但是每个子类都需要自己完整描述的@JsonCreator

public Subclass1 extends Superclass {
    String color;

    @JsonCreator
    public Subclass1(@JsonProperty("id") int id,
                     @JsonProperty("name") String name,
                     @JsonProperty("color") String color)
    {
        super(id, name);
        this.color = color;
    }
}

public Subclass2 extends Superclass {
    int height;

    @JsonCreator
    public Subclass1(@JsonProperty("id") int id,
                     @JsonProperty("name") String name,
                     @JsonProperty("height") int height)
    {
        super(id, name);
        this.height = height;
    }
}

Jackson (2.x) 有什么方法可以从超类中提取有关预期 JSON 字段的信息并避免这种重复?

4

1 回答 1

2

由于您的类似乎不是不可变的,您可以将 @JsonSetter 注释放在基类中的“id”和“name”属性的 setter 方法上。然后反序列化将创建适当的子类型并使用设置器而不是构造器。

public class Superclass {
    private int id;
    private String name;

    @JsonSetter
    public void setId(int id) { ... }

    @JsonSetter
    public void setName(String name) { ... }
}

public Subclass1 extends Superclass {
    private String color;

    @JsonSetter
    public void setColor(String color) { ... }
}

public Subclass2 extends Superclass {
    private int height;

    @JsonSetter
    public void setHeight(int height) { ... }
}

您也可以使用@JsonSubTypes。这个注解会出现在 Superclass 上,你必须列出对每个子类型(Subclass1 和 Subclass2)的引用。我不知道这是否可以让您利用超类中的@JsonCreator 来避免在子类中重复“id”和“name”属性,但我认为值得一试。这种方法的缺点是您的基类具有对子类型的显式引用。

于 2014-01-22T17:33:56.683 回答