Сериализация и десериализация JSON в Jackson: разные имена
Быстрый ответ
Для определения разных имен свойств JSON при сериализации и десериализации используйте аннотации @JsonProperty
и @JsonAlias
следующим образом:
@JsonProperty("serialized_name")
private String propertyName; // Имя при сериализации
@JsonAlias({"alias1", "alias2"})
public void setPropertyName(String propertyName) { // Имена при десериализации
this.propertyName = propertyName;
}
Таким образом, свойство будет сериализовано под именем "serialized_name", а при десериализации его можно вызвать по имени "alias1" или "alias2".
Подробности об аннотациях Jackson
Выбор подходящей аннотации
@JsonProperty
отлично согласуется с полями Java и JSON:
- Для классового поля она определяет имя, которое будет использовано при сериализации.
- Применяется к методам getter и setter, задавая имена для обеих операций – сериализации и десериализации.
- Для определения дополнительных имён при десериализации используйте
@JsonAlias
.
Наименование методов с использованием аннотаций
Вы можете применить @JsonGetter
и @JsonSetter
для явного указания имен на уровне методов:
- Следовательность имена метода и имя свойства JSON должны совпадать.
Для различных сценариев сериализации контролируйте имена с использованием разных getter и setter методов, аннотированных
@JsonProperty
.Соответствие версий Jackson
Проверьте актуальность версии библиотеки Jackson для использования указанных аннотаций. Например, @JsonAlias
доступна начиная с версии 2.9.0.
Распространённые трудности и особенности использования
Импорт аннотаций
Используя Lombok, важно не путать @Getter
от Lombok и @JsonGetter
от Jackson, поскольку эти аннотации предназначены для разных целей и могут вызвать конфликты.
Правила именования полей
При использовании аннотаций имена должны точно соответствовать JSON. Иначе это может привести к возникновению исключения Unrecognized field exception
.
Визуализация
Сериализацию можно сравнить с упаковкой чемодана перед поездкой: с помощью аннотаций мы даем нашим "вещам" форму для JSON. Десериализацию, в свою очередь, можно представить как распаковку чемодана, когда мы вновь обнаруживаем свои вещи с помощью знакомых названий.
Сериализация (🎒🏷️📦➡️🛄💍👗👠):
Обручальное кольцо ➡️ "SparklingCirclet"
Вечернее платье ➡️ "FlowingChiffon"
Шпильки ➡️ "TowerHeels"
Десериализация (🛄🍳👟👚⬅️):
"SparklingCirclet" ➡️ Сковорода
"FlowingChiffon" ➡️ Толстовка
"TowerHeels" ➡️ Кроссовки
Применение на практике
Взаимодействие со старыми системами
Старые системы или API часто следуют нестандартным правилам наименования. @JsonProperty
и @JsonAlias
позволяют нам адаптировать названия в нашей Java-модели.
Версионирование API
При версионировании API, иногда необходимо поддерживать старые имена свойств JSON. Это можно сделать с помощью @JsonAlias
, вводя в то же время и новые имена.
Консистентность в команде
Ваша команда должна быть осведомлена о существовании этих аннотаций и использовать их в соответствии с принципами проекта, обеспечивая единообразие кода и предотвращая путаницу между разработчиками.
Тестирование целостности данных
Тщательное тестирование процессов сериализации и десериализации поможет выявить ошибки сопоставления и обеспечит стабильный порядок в производственной среде.
Полезные материалы
- GitHub – FasterXML/jackson-annotations: Core annotations for Jackson data processor – Подробная информация об основных аннотациях Jackson.
- java – When is the @JsonProperty property used and what is it used for? – Stack Overflow – Обсуждение @JsonProperty на Stack Overflow дает более глубокое понимание.
- Jackson Annotations – @JsonProperty – Обобщенная информация о @JsonProperty собрана здесь.
- Стартуем | Потребление RESTful веб-сервиса – Руководство по использованию Jackson для работы с RESTful сервисами в рамках Spring Framework.