Это было на самом деле проще, чем я думал, чтобы решить это. Я получил его с помощью следующего:
- Пользовательская реализация десериализатора:
public class VehicleDeserializer extends StdDeserializer<Vehicle> {
public VehicleDeserializer() {
super(Vehicle.class);
}
@Override
public Vehicle deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
if (jp.currentToken() == JsonToken.VALUE_STRING) {
Car car = new Car();
car.setName(jp.readValueAs(String.class));
return car;
}
return jp.readValueAs(Vehicle.class);
}
}
Чтобы избежать циклических зависимостей и заставить настраиваемый десериализатор работать с аннотациями polymorphi c
@JsonTypeInfo
и
@JsonSubTypes
, я сохранил эти аннотации на уровне класса
Vehicle
, но поместил следующие аннотации в объект контейнера Я десериализирую:
public class Transport {
@JsonDeserialize(using = VehicleDeserializer.class)
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
private Vehicle modeOfTransport;
// Getter, setters
}
Это означает, что по умолчанию Транспортное средство десериализуется как объект polymorphi c, если явно не указано, чтобы десериализовать его с помощью моего пользовательского десериализатора. Этот десериализатор, в свою очередь, будет в свою очередь откладывать полиморфизм, если входные данные не являются String.
Надеемся, это поможет кому-то столкнуться с этой проблемой:)