我目前需要序列化对象列表。每个对象实现相同的接口,但我需要保留每个对象的原始类型,因此我使用@JsonTypeInfo。例如,我们有两个类,Square和Triangle,它们实现了IGeometry接口:
public class Square implements IGeometry {
private int x;
private int y;
private int h;
private int w;
// get set ...
}
public class Triangle implements IGeometry {
private int x;
private int y;
private int a;
private int b;
private int c;
// get set ...
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({ @Type(name = "triangle", value = Triangle.class), @Type(name = "square", value = Square.class) })
public interface IGeometry {
}
现在,如果我这样做:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
IGeometry geo01 = new Triangle(1, 2, 3, 4, 5);
System.out.println(mapper.writeValueAsString(geo01));
它工作正常,我有以下输出:
{
"triangle" : {
"x" : 1,
"y" : 2,
"a" : 3,
"b" : 4,
"c" : 5
}
}
现在,由于java类型擦除,如果我尝试制作IGeometry列表,则忽略@JsonTypeInfo(List被替换为不包含@JsonTypeInfo的List)。所以,如果我这样做:
IGeometry geo01 = new Triangle(1, 2, 3, 4, 5);
IGeometry geo02 = new Square(1, 2, 3, 4);
List<IGeometry> geoList = new ArrayList<IGeometry>();
geoList.add(geo01);
geoList.add(geo02);
System.out.println(mapper.writeValueAsString(geoList));
我得到了这个:
[ {
"x" : 1,
"y" : 2,
"a" : 3,
"b" : 4,
"c" : 5
}, {
"x" : 1,
"y" : 2,
"h" : 3,
"w" : 4
} ]
我知道有一个解决方案意味着扩展一个具有所需类型的ArrayList并将其用于序列化:
public class GeometryList extends ArrayList<IGeometry> {
}
这有效,但我想知道是否有其他解决方案。那么是否有人已经遇到过这种问题并以不同的方式解决了这个问题?