Подтвердить что ты не робот

Джексон - Как указать единую реализацию для десериализации, связанной с интерфейсом?

Я хочу десериализовать JSON-объект с Джексоном. Поскольку целью является интерфейс, мне нужно указать, какую реализацию следует использовать.

Эта информация может быть сохранена в JSON-Object, используя @JsonTypeInfo-Annotation. Но я хочу указать реализацию в исходном коде, потому что он всегда один и тот же.

Возможно ли это?

4b9b3361

Ответ 1

Используйте SimpleAbstractTypeResolver:

ObjectMapper mapper = new ObjectMapper();

SimpleModule module = new SimpleModule("CustomModel", Version.unknownVersion());

SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver();
resolver.addMapping(Interface.class, Implementation.class);

module.setAbstractTypes(resolver);

mapper.registerModule(module);

Ответ 2

Существует другой подход, который будет работать, если у вас есть только реализация одного интерфейса.

public class ClassYouWantToDeserialize {
    @JsonDeserialize(as = ImplementationClass.class)
    private InterfaceClass property;
...
}

Этот вопрос был дан ответ некоторое время назад, но я хочу дать вам еще один вариант, который не требует настройки ObjectMapper, а также гораздо более простой, чем @JsonTypeInfo аннотации.

Ответ 3

Вы также можете использовать @JsonDeserialize(as = ImplementationClass.class) на интерфейсе, и все ссылки будут десериализованы одинаково.

Обратите внимание, что если один из ваших классов реализации является перечислением, вам может понадобиться @JsonFormat(shape = JsonFormat.Shape.OBJECT) в перечислении.