2012-02-28 98 views
1

我尝试反序列化Java类时遇到了一些问题。 我的类别是:如何用Jackson JSON和JAVA反序列化多态LinkedList?

Abstract Class A { 
Long ID 
String name 
... 
} 
Class B extends A{ 
String Type 
String Value 
} 
Class C extends A{ 
List<A> typedList; 
} 

我的序列化/ Deseralization方法:

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时,杰克逊无法正确重建我的typedList。 它使用LinkedHashMap而不是LinkedList,并且不使用正确的类型。 任何想法如何解决这个问题? 在此先感谢!

+0

@alfasin这与php – NimChimpsky 2012-02-28 18:34:43

回答

6

如果您希望获得一个列表,您必须通过一个列表类型:在这里您给予的类型为clazz,但期望类型为List<T>。这将不起作用,即使clazzList类型。 所以你需要通过适当的类型。但是对于List(和Map)类型,您还需要指定内容类型:而类型变量不会。什么起作用是这样的:

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

其中TypeReference由于Java类型擦除必须使用。

您也可以从组件构造结构类型的动态,如果他们被作为参数传递:

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

LinkedHashMap究其原因,就是因为缺少类型的信息:如果JSON对象遇到,和请求类型是java.lang.Object(如果你只是通过类型List.class来绑定),这是将被使用的类型。

+1

无关。感谢您的帮助。像魅力一样工作=)。 – user1238518 2012-02-29 20:34:08

+0

很高兴听到它的工作! – StaxMan 2012-03-01 20:39:06