#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);