Java Jackson、通用列表和JsonTypeInfo
我目前需要序列化一个对象列表。每个对象实现相同的接口,但我需要保持每个对象的原始类型,因此我使用@JsonTypeInfo。例如,我们有两个类,Square和Triangle,它们实现了IGeometry接口:Java Jackson、通用列表和JsonTypeInfo,java,generics,jackson,fasterxml,Java,Generics,Jackson,Fasterxml,我目前需要序列化一个对象列表。每个对象实现相同的接口,但我需要保持每个对象的原始类型,因此我使用@JsonTypeInfo。例如,我们有两个类,Square和Triangle,它们实现了IGeometry接口: public class Square implements IGeometry { private int x; private int y; private int h; private int w; // get set ... } p
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类型的擦除,如果我尝试创建一个IGometry列表,@JsonTypeInfo被忽略(列表被不包含@JsonTypeInfo的列表替换)。因此,如果我这样做:
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));
我知道有一种解决方案意味着使用所需类型扩展ArrayList并将其用于序列化:
public class GeometryList extends ArrayList<IGeometry> {
}
公共类GeometryList扩展了ArrayList{
}
这是可行的,但我想知道是否还有其他解决方案。那么,是否有人已经遇到了这种问题,并以不同的方式解决了它呢?我唯一能想到的是,创建一个JsonNode并对其进行迭代,然后为每个元素创建一个JsonNode(然后它将包括该类型),完成后,将其全部放在一个JsonNode中并编写它。
public class GeometryList extends ArrayList<IGeometry> {
}