Как десериализовать унаследованный POJO из JSON - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь десериализовать объект POJO (NoteObj) из JSON.Объект POJO распространяется на Item (абстрактный объект), на котором у меня есть пользовательский десериализатор.Этот пользовательский десериализатор гарантирует, что если в качестве POJO требуется класс IItem, то вместо абстрактного класса будет возвращен конкретный класс (Edge или Vertex).

Однако, когда я хочу вернуть NoteObj экземпляр, когда я звоню, чтобы использовать его.Но если я вызываю десериализатор с NoteObj.class, я всегда получаю ArrayList<Vertex> вместо этого, потому что вместо некоторого стандартного десериализатора Джексона используется NoteObj extends Item и мой пользовательский ItemDeserializer.

Класс интерфейса IItem:

@JsonDeserialize(
  using = ItemDeserializer.class
)
public interface IItem {
...
}

Элемент абстрактного класса

@JsonInclude(Include.NON_EMPTY)
@JsonDeserialize(
  using = ItemDeserializer.class
)
public abstract class Item implements IItem, Serializable {
...
}

Объект POJO, где мне нужно использовать не ItemDeserializer, а стандартный десериализатор Джексона, чтобы я получил NoteObj

public class NoteObj extends Item implements IItem {
...
}

Другой класс, который возвращается ItemDeserialzier (Edge такой же):

@JsonDeserialize(using = JsonDeserializer.None.class)
public class Vertex extends Item implements IVertex, Serializable {
...
}

Код ItemDeserializer:

public class ItemDeserializer extends JsonDeserializer<IItem> {
 protected ItemDeserializer() {
 }

 public IItem deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
  TreeNode node = jsonParser.readValueAsTree();

   if (node.get("_from") != null) {
     return (Edge)jsonParser.getCodec().treeToValue(node, Edge.class);
   } else { 
     return (Vertex)jsonParser.getCodec().treeToValue(node, Vertex.class);
   }
 }
}

Я уже пытался использовать @JsoNDeserialize с JsonNodeDeserializer.class в определении класса NoteObj, но это не возвращает POJO, а LinkedHashList.Я попытался использовать None.class, но это все еще относится к ItemDeserializer.

У меня была идея, что я бы изменил ItemDeserializer, чтобы он возвращал запрошенный POJO (например, не только Edge, Vertex, но и общий класс, например NoteObj).Однако я не знаю, как определить, какой общий класс был запрошен для возврата.

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