当我尝试反序列化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时,杰克逊无法正确重建我的typedList。 它使用LinkedHashMap而不是LinkedList,并且不使用正确的类型。 任何ideias怎么解决这个? 提前谢谢!
答案 0 :(得分:6)
如果您希望获得List,则必须传递List类型:此处您提供的类型为clazz
,但期望类型为List<T>
。即使clazz
的类型为List
,这也无效。
所以你需要传递正确的类型。但是对于List(和Map)类型,还需要指定内容类型:而type变量不能。有用的是:
List<MyType> list = mapper.readValue(jsonSource, new TypeReference<List<MyType>>() { });
由于Java类型擦除,必须使用TypeReference
。
如果它们作为参数传递,您也可以动态地从组件构造结构化类型:
Class<?> elem = ...;
List<?> list = mapper.readValue(jsonSource,
mapper.getTypeFactory().constructCollectionType(ArrayList.class, elem);
你得到LinkedHashMap
的原因只是因为缺少类型信息:如果遇到JSON对象,请求的类型是java.lang.Object
(如果你刚刚传递了类型{{1}那就是这种情况绑定到),这是将要使用的类型。