[英]How can I deserialize a Json String to get polymorphic result using Java and Jackson Library?
[英]How to deserialize polymorphic LinkedList with Jackson JSON and JAVA?
嘗試反序列化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,並且不使用正確的類型。 任何想法如何解決這個問題? 提前致謝!
如果希望獲得列表,則必須傳遞一個List類型:在這里,您給出的是clazz
類型,但期望為List<T>
類型。 即使clazz
是List
類型,這也不起作用。 因此,您需要傳遞正確的類型。 但是對於列表(和地圖)類型,您還需要指定內容類型:而類型變量則不行。 有效的是這樣的:
List<MyType> list = mapper.readValue(jsonSource, new TypeReference<List<MyType>>() { });
由於要清除Java類型, TypeReference
必須使用TypeReference
。
如果將它們作為參數傳遞,則還可以從組件動態構造結構化類型:
Class<?> elem = ...;
List<?> list = mapper.readValue(jsonSource,
mapper.getTypeFactory().constructCollectionType(ArrayList.class, elem);
獲得LinkedHashMap
的原因僅是因為缺少類型信息:如果遇到JSON對象,並且請求的類型為java.lang.Object
(如果您只是通過傳遞要綁定的類型List.class
就是這種情況)。將使用的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.