Невозможно десериализовать коллекцию полиморфных типов JSon - PullRequest
1 голос
/ 08 августа 2010

У меня действительно раздражающая проблема, пожалуйста, посмотрите на код:

    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 расширяют сообщение.

Итак, когда я распечатываю s после writeValueAsString, получаю вот что:

[["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, у меня есть почти все API, которые есть у ObjectMapper.

Небольшая помощь будет очень признательна.

1 Ответ

0 голосов
/ 09 августа 2010

Из-за стирания Java-типов НЕ возможно указать универсальные типы для привязки.Чтобы передать полную информацию о типовых типах для связывания 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 (...)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...