我有一个非常烦人的问题,请看一下代码:
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扩展消息。
所以当我在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。
非常感谢一点帮助。
答案 0 :(得分:0)
由于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(...)类似地构造所有类型的泛型类型。)