简体   繁体   English

无法反序列化多态类型的JSon集合

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

I have a really annoying problem , please take a look at the code: 我有一个非常烦人的问题,请看一下代码:

    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 , and PresenceMessage extend Message. RoomTextMessage和PresenceMessage扩展了Message。

So when I print out s after writeValueAsString , this is what I get : 所以当我在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}]]

I have no idea how to covert it back to the arrayList , I have almost every API the ObjectMapper has. 我不知道如何将其转换回arrayList,我几乎拥有ObjectMapper拥有的每个API。

A little help would be very appreciated. 一点帮助将不胜感激。

Due to Java Type Erasure it is NOT possible to specify generic types to bind to. 由于Java Type Erasure,无法指定要绑定的通用类型。 In order to pass full generics type information to bind JSON into List, you have to use methods that take either TypeReference or JavaType, like so: 为了传递完整的泛型类型信息以将JSON绑定到List,您必须使用采用TypeReference或JavaType的方法,如下所示:

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

to use JavaType, you need to construct method by passing java.lang.reflect.Type into TypeFactory (check out JavaDocs for details), respectively: 要使用JavaType,您需要通过分别将java.lang.reflect.Type传递到TypeFactory中来构造方法(有关详细信息,请参阅JavaDocs):

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

if you don't like anonymous inner classes (you can similarly construct all kinds of generics types, with TypeFactory.parametericType(...)). 如果您不喜欢匿名内部类(可以类似地使用TypeFactory.parametericType(...)构造各种泛型类型)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM