Я пытаюсь десериализовать объект 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).Однако я не знаю, как определить, какой общий класс был запрошен для возврата.