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

时间:2010-08-08 19:22:50

标签: java json

我有一个非常烦人的问题,请看一下代码:

    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。

非常感谢一点帮助。

1 个答案:

答案 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(...)类似地构造所有类型的泛型类型。)