Глобальная сериализация полей в JSON с помощью Jackson
Быстрый ответ
Для настройки библиотеки Jackson на глобальное использование только полей класса сконфигурируйте экземпляр ObjectMapper
следующим образом:
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Если вы хотите настроить видимость полей для конкретного класса, используйте аннотацию @JsonAutoDetect:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class YourClass {
// определение полей класса
}
Глубже в тему: дополнительные настройки
Глобальные настройки с помощью обёртки ObjectMapper
Чтобы обеспечить единообразие настроек во всем приложении, можно создать обёртку для ObjectMapper
, которая будет предоставлять заранее настроенный экземпляр:
public class ObjectMapperWrapper {
private static final ObjectMapper MAPPER = new ObjectMapper();
static {
MAPPER.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
MAPPER.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}
public static ObjectMapper getMapper() {
return MAPPER; // Возвращает уже настроенный ObjectMapper для использования в разных частях приложения.
}
}
Настройка геттеров, сеттеров и создателей объектов
Если вам необходимо отдельно настроить видимость для геттеров, сеттеров и создателей объектов (конструкторов), делайте это вот так:
mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE);
Использование миксинов для регулировки видимости
Миксины позволяют управлять аннотациями без изменения исходного кода классов. Для установки глобальной видимости полей можно определить миксин следующим образом:
public interface FieldVisibilityMixin {
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
}
mapper.addMixIn(Object.class, FieldVisibilityMixin.class); // Используем магию миксинов!
Применение миксина установит видимость полей всех классов для Jackson в режим ANY.
Визуализация
Работу Jackson с объектами можно представить как форматирование статьи:
| Настройка | Формат статьи |
| ----------------------- | -------------------- |
| По умолчанию | 📝Текст и 📌Сноски |
| Только с видимостью полей| 📝Только текст |
Настроив Jackson работать только с полями, мы убираем "сноски" из наших данных, и в итоге получаем чистый и универсальный результат:
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Это преобразует формат нашей "статьи" следующим образом:
До: [📝📌, 📝📌, 📝📌]
После: [📝, 📝, 📝]
Практическое применение: когда это актуально
Настройка на уровне класса при помощи аннотаций
Для тех классов, которым необходима специфическая настройка, отличающаяся от глобальной, используйте аннотацию @JsonAutoDetect
на уровне класса:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE) // "Поля ничего не значат для меня!" – заявляет Jackson.
public class AnnotatedClass {
// поля этого класса будут игнорированы при сериализации
}
Конфигурация в Spring Boot
При использовании Spring Boot вы можете объявить настройки в конфигурационном файле:
spring.jackson.visibility.field=ANY
spring.jackson.visibility.getter=NONE
spring.jackson.visibility.is-getter=NONE
spring.jackson.visibility.setter=NONE
spring.jackson.visibility.creator=NONE
Такой подход позволит вам гибко управлять настройками в разных средах.
Важные заметки
Описанные методы способны обеспечить эффективную сериализацию данных, но они не являются всемогущими. В сложных случаях, когда требуется детальный контроль над структурой JSON или над сохранением обратной совместимости, могут потребоваться дополнительные настройки.
Полезные материалы
- Стратегии наименования свойств в Jackson – настройки сериализации — подходы к настройке наименования полей.
- Миксины Jackson – детализация управления сериализацией и десериализацией JSON — подробное руководство по использованию миксинов.
- Jackson и Spring: глобальная сериализация JSON – интеграция в Spring MVC — примеры настройки глобальной сериализации в Spring MVC.
- Jackson @JsonIgnore – глобальное игнорирование свойств — методы управления видимостью полей.
- GitHub-репозиторий Jackson – исходный код и последние обновления — репозиторий для детального изучения Jackson.