Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson、通用列表和JsonTypeInfo_Java_Generics_Jackson_Fasterxml - Fatal编程技术网

Java Jackson、通用列表和JsonTypeInfo

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

我目前需要序列化一个对象列表。每个对象实现相同的接口,但我需要保持每个对象的原始类型,因此我使用@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类型的擦除,如果我尝试创建一个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> {

}