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

如何使用Jackson JSON和JAVA反序列化多态LinkedList?,java,json,polymorphism,jackson,deserialization,Java,Json,Polymorphism,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; } 以及我的序列化/反序列化方法: public String serialize(T object) { String returnValue =

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

Abstract Class A {
Long ID
String name 
...
}
Class B extends A{ 
String Type
String Value
}
Class C extends A{
List<A> typedList;
}
以及我的序列化/反序列化方法:

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;
    }
C类中的列表包含B和C元素。序列化可以顺利完成,但当我尝试反序列化C时,Jackson无法正确重建我的typedList。 它使用LinkedHashMap而不是LinkedList,并且没有使用正确的类型。 有没有办法解决这个问题?
提前谢谢

如果您希望获得一个列表,那么必须传递一个列表类型:这里您给出的是clazz类型,但expect type of List。即使clazz是List类型,这也不起作用。 所以你需要通过适当的类型。但对于列表和映射类型,您还需要指定contents type:而type变量不需要。工作原理如下:

List<MyType> list = mapper.readValue(jsonSource, new TypeReference<List<MyType>>() { });

获取LinkedHashMap的原因是缺少类型信息:如果遇到JSON对象,请求的类型是java.lang.Object,就像刚刚传递要绑定的type List.class一样,这就是将使用的类型。

如果希望获取列表,您必须传递一个列表类型:这里您给出的是clazz的类型,但期望列表的类型。即使clazz是List类型,这也不起作用。 所以你需要通过适当的类型。但对于列表和映射类型,您还需要指定contents type:而type变量不需要。工作原理如下:

List<MyType> list = mapper.readValue(jsonSource, new TypeReference<List<MyType>>() { });

获取LinkedHashMap的原因只是因为缺少类型信息:如果遇到JSON对象,请求的类型是java.lang.Object,就像您刚刚传递要绑定的type List.class一样,这是将要使用的类型。

@alfasin这与php@alfasin这与phpThanks的帮助无关。工作很有魅力,谢谢你的帮助。工作得很有魅力。