簡體   English   中英

無法反序列化多態類型的JSon集合

[英]Cannot de-serialize JSon collection of polymorphic types

我有一個非常煩人的問題,請看一下代碼:

    ObjectMapper mapper = new ObjectMapper();
    List<Message> messageList = new ArrayList<Message>();
    messageList.add(new RoomTextMessage(1,"2","22",1));
    messageList.add(new PresenceMessage(1,1,2, UserStatus.OFFLINE));
    mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS);
    String s = mapper.writeValueAsString(messageList);


    mapper.convertValue(s,???)

RoomTextMessage和PresenceMessage擴展了Message。

所以當我在writeValueAsString之后打印出s時,這就是我得到的:

[["com.delver.chateau.message.RoomTextMessage",{"text":"22","roomId":"2","userId":1,"sequence":1}],["com.delver.chateau.message.PresenceMessage",{"friendId":2,"status":"OFFLINE","userId":1,"sequence":1}]]

我不知道如何將其轉換回arrayList,我幾乎擁有ObjectMapper擁有的每個API。

一點幫助將不勝感激。

由於Java Type Erasure,無法指定要綁定的通用類型。 為了傳遞完整的泛型類型信息以將JSON綁定到List,您必須使用采用TypeReference或JavaType的方法,如下所示:

List<Message> result = mapper.readValue(s, new TypeReference<List<Message>>() { });

要使用JavaType,您需要通過分別將java.lang.reflect.Type傳遞到TypeFactory中來構造方法(有關詳細信息,請參閱JavaDocs):

List<Message> result = mapper.readValue(s, TypeFactory.collectionType(ArrayList.class, Message.class));

如果您不喜歡匿名內部類(可以類似地使用TypeFactory.parametericType(...)構造各種泛型類型)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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