Я просмотрел много вопросов, связанных с этим, но я не могу найти этот конкретный прецедент. Успение здесь заключается в том, что я использую библиотеку Java Jackson.Специальная десериализация Джексона для полиморфных объектов
у меня есть следующие иерархии классов:
public class Event {
@JsonProperty("si")
String sessionId;
@JsonProperty("eventType")
String eventType;
...
}
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class InitEvent extends Event
{
@JsonProperty("pm")
Params params;
public Params getParams()
{
return params;
}
.....
}
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class RecoEvent extends Event
{
@JsonProperty("ti")
String targetId;
@JsonProperty("tt")
int targetType;
public String getTargetId()
{
return targetId;
}
....
}
Правило десериализации является:
Если типСобытия == 0, то десериализации к InitEvent
Если типСобытия == 0 затем десериализовать в RecoEvent
Из разряда десериализация Джексона не будет работать, потому что он не знает, к какому классу десериализуем. Один из способов справиться с этим, делая как следует на базовый классе:
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class Event
Проблема этого решения заключается в предполагающем клиент будет сериализовать с тем же картографом, так как элемент @class должен присутствовать в настоящее время в формате JSON ,
Мой клиент не отправит дополнительный элемент @class во входящий JSON.
Какое необходимо разрешение?
Как я могу написать собственный десериализатор, который выбирает правильный производный класс на основе значения eventType?
Thx заранее
Я нашел [этот образец] (https://github.com/fge/json-patch/blob/master/src/main/java/com/github/fge/jsonpatch/JsonPatchOperation.java) с открытым исходным кодом проект. Атрибут «op» настроен для использования в качестве подсказки типа для создания подтипа. Может быть, это помогает? С уважением, Marius –