簡體   English   中英

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

[英]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>類型。 即使clazzList類型,這也不起作用。 因此,您需要傳遞正確的類型。 但是對於列表(和地圖)類型,您還需要指定內容類型:而類型變量則不行。 有效的是這樣的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM