我有一些对象在超类中有一组共享属性:
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字段的信息并避免重复?
答案 0 :(得分:2)
由于您的类似乎不是不可变的,因此可以在基类中为“id”和“name”属性设置@JsonSetter注释。然后反序列化将创建适当的子类型并使用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)的引用。我不知道如果这样可以让你在Superclass中利用@JsonCreator来避免重复子类中的“id”和“name”属性,但我认为值得一试。这种方法的缺点是您的基类具有对子类型的显式引用。