杰克逊,通用列表和JsonTypeInfo

时间:2016-06-09 08:25:52

标签: 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 ...
}

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> {

}

这有效,但我想知道是否有其他解决方案。那么是否有人已经遇到过这种问题并以不同的方式解决了这个问题?

0 个答案:

没有答案