Игнорирование свойства в Jackson без исходного кода: решение
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для исключения свойств из процесса сериализации, в библиотеке Jackson можно задействовать так называемые миксины с аннотацией @JsonIgnore
:
@JsonIgnoreProperties({"propertyToIgnore"})
abstract class MyMixin {}
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Target.class, MyMixin.class);
Таким образом, Jackson при сериализации объектов класса Target
будет игнорировать свойство propertyToIgnore
.
Настройка процесса сериализации без прямых изменений в исходном коде
В ситуации, когда вам необходимо исключить некоторые данные из сериализации, не имея доступа к исходному коду объектов, Jackson предлагает следующие возможности:
Игнорирование неизвестных свойств: вы можете настроить
ObjectMapper
таким образом, чтобы он пренебрегал неизвестными свойствами:objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Сколько игнорировать неизвестных свойств можно с помощью аннотации
@JsonIgnoreProperties
прямо в классе: это позволит вам просто игнорировать свойства, которые вам еще не встречались:@JsonIgnoreProperties(ignoreUnknown = true)
Визуализация
Предположим, вы используете Jackson для того, чтобы создать сериализованное представление объекта. Это можно сравнить с фотографированием объекта:
📷 -> { "property1": "value1", "property2": "value2", "property3": "value3" }
Если же вы хотите скрыть определенное свойство, это можно сравнить с уборкой этого свойства из зоны видимости фотокамеры:
🔮🙅♂️ "property2"
Применяя аннотацию @JsonIgnoreProperties
, вы, по сути, накладываете на камеру фильтр, который исключает это свойство из результата:
Фильтр камеры (📸🔲) = @JsonIgnoreProperties(value = { "property2" })
В итоге, сериализованный объект будет без свойства property2
:
📸🔲 -> { "property1": "value1", "property3": "value3" }
Применение миксинов и фильтров в сериализации
Заглобальный контроль миксином
Jackson предоставляет возможность создать общее правило для множества классов. Это можно сделать с помощью setMixInResolver
и реализации интерфейса MixInResolver
, что позволяет динамически определять миксины для различных классов.
@JsonIgnoreProperties({"unwantedGlobalProperty"})
abstract class GlobalPropertyIgnoreMixIn {}
mapper.setMixInResolver(new SimpleMixInResolver(null) {
@Override
public Class<?> findMixInClassFor(Class<?> cls) {
return GlobalPropertyIgnoreMixIn.class;
}
});
Динамическое управление сериализацией при помощи JsonFilter
JsonFilter
добавляет больше гибкости в управление выводом сериализованных данных:
Определите фильтр:
@JsonFilter("yourFilter") abstract class YourBean {}
Настройте правила фильтрации:
SimpleFilterProvider filters = new SimpleFilterProvider().addFilter("yourFilter", SimpleBeanPropertyFilter.serializeAllExcept("propertyToIgnore"));
Примените фильтр с использованием
ObjectWriter
:ObjectWriter writer = mapper.writer(filters);
Руководство по настройке десериализации
Не забывайте также о возможности использования аннотаций @JsonCreator
и @JsonProperty
для дополнительной настройки процесса десериализации:
class CustomDeserialized {
private String property1;
@JsonCreator
public CustomDeserialized(@JsonProperty("property1") String prop1) {
this.property1 = prop1;
}
}
Полезные материалы
- JsonIgnore (Jackson-annotations 2.7.0 API) — документация по аннотации @JsonIgnore в Jackson.
- Пользовательская сериализация и десериализация в Jackson — статья об особенностях пользовательской сериализации и десериализации данных.
- Фильтрация в Jackson – использование SimpleFilterProvider — обучающие материалы по применению фильтров в Jackson для исключения свойств при сериализации.
- Руководство по Java 8 Optional – для работы со свойствами — путеводитель по использованию Java 8 Optional, который пригодится при работе со значениями null.
- Полиморфная десериализация в Jackson – для продвинутых случаев использования — обзор возможностей полиморфной десериализации данных в Jackson.