Джексон — JsonTypeInfo, свойство, которое может обрабатывать как верблюжий, так и змеиный случай

#java #jackson

Вопрос:

Есть ли способ с помощью аннотации Джексона указать свойство в JsonTypeInfo для обработки как верблюжьего, так и змеиного случая? Например, следующее будет обрабатывать случай только для правильной сериализации строки JSON, в которой используется змеиный регистр. Есть ли способ обрабатывать как сериализацию, так и десериализацию с помощью аннотаций? Я весь внимание и на другие предложения. Спасибо!

 @JsonTypeInfo(  use = Id.NAME,  include = As.EXISTING_PROPERTY,  property = "data_type",  visible = true,  defaultImpl = ActionDataImpl.class) @JsonSubTypes(value = {  @JsonSubTypes.Type(value = LogActionDataImpl.class, name = "LogActionData") }) public interface IActionData {   @JsonProperty("data_type")  String getDataType();   String getNumber();   String getFoo(); }  

Комментарии:

1. Принимает ли josonpropery несколько значений?

2. @Popeye, свойство не принимает несколько значений

Ответ №1:

Мое решение состоит в том, чтобы создать еще один интерфейс, который используется в качестве миксина, особенно когда я ожидаю именования полей с использованием змеиного регистра.

 @JsonTypeInfo(  use = Id.NAME,  include = As.EXISTING_PROPERTY,  property = "dataType",  visible = true,  defaultImpl = ActionDataImpl.class) @JsonSubTypes(value = {  @JsonSubTypes.Type(value = LogActionDataImpl.class, name = "LogActionData") }) public interface IActionData {   String getDataType();   String getNumber();   String getFoo(); }  @JsonTypeInfo(  use = Id.NAME,  include = As.EXISTING_PROPERTY,  property = "data_type",  visible = true,  defaultImpl = ActionDataImpl.class) @JsonSubTypes(value = {  @JsonSubTypes.Type(value = LogActionDataImpl.class, name = "LogActionData") }) public interface IActionDataSnakeCase extends IActionData { }  

При создании картографа объектов со змеиным корпусом я бы сделал это.

 final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); objectMapper.addMixIn(IActionData.class, IActionDataSnakeCase.class);