如何使用Jackson JSON和JAVA反序列化多态LinkedList?

1 java polymorphism json jackson deserialization

当我尝试反序列化Java类时,我遇到了一些问题.我的课程是:

Abstract Class A {
Long ID
String name 
...
}
Class B extends A{ 
String Type
String Value
}
Class C extends A{
List<A> typedList;
}
Run Code Online (Sandbox Code Playgroud)

我的序列化/解除方法:

public String serialize(T object) {
        String returnValue = "";

        try {
            returnValue = mapper.writeValueAsString(object);

        } catch (JsonGenerationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(returnValue);
        return returnValue;
    }

public List<T> unserialize(String data, Class<?> clazz) {
        List<T> returnValue = new LinkedList<T>();
        //JavaType topMost = mapper.getTypeFactory().constructParametricType(MyWrapper.class, ActualClassRuntime.class); 
        try {

            returnValue = (List<T>) mapper.readValue(data,clazz);
        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return returnValue;
    }
Run Code Online (Sandbox Code Playgroud)

C类中的列表包含B和C元素.序列化没有问题但是当我试图反序列化C时,杰克逊无法正确重建我的typedList.它使用LinkedHashMap而不是LinkedList,并且不使用正确的类型.任何ideias怎么解决这个?提前致谢!

Sta*_*Man 6

如果你希望得到一个List,你必须传递一个List类型:在这里你给出的类型clazz但是期望类型List<T>.即使clazz属于类型,这也行不通List.所以你需要传递正确的类型.但是对于List(和Map)类型,还需要指定内容类型:而type变量不能.有效的是:

List<MyType> list = mapper.readValue(jsonSource, new TypeReference<List<MyType>>() { });
Run Code Online (Sandbox Code Playgroud)

这里TypeReference必须使用由Java类型擦除.

如果它们作为参数传递,您还可以动态地从组件构造结构化类型:

Class<?> elem = ...;
List<?> list = mapper.readValue(jsonSource,
  mapper.getTypeFactory().constructCollectionType(ArrayList.class, elem);
Run Code Online (Sandbox Code Playgroud)

你得到的原因LinkedHashMap只是因为缺少类型信息:如果遇到JSON对象,并且请求的类型是java.lang.Object(如果你只是传递List.class要绑定的类型的话就是这种情况),这就是要使用的类型.