Игнорирование свойства в Jackson без исходного кода: решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для исключения свойств из процесса сериализации, в библиотеке Jackson можно задействовать так называемые миксины с аннотацией @JsonIgnore:

Java
Скопировать код
@JsonIgnoreProperties({"propertyToIgnore"})
abstract class MyMixin {}

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Target.class, MyMixin.class);

Таким образом, Jackson при сериализации объектов класса Target будет игнорировать свойство propertyToIgnore.

Кинга Идем в IT: пошаговый план для смены профессии

Настройка процесса сериализации без прямых изменений в исходном коде

В ситуации, когда вам необходимо исключить некоторые данные из сериализации, не имея доступа к исходному коду объектов, Jackson предлагает следующие возможности:

  1. Игнорирование неизвестных свойств: вы можете настроить ObjectMapper таким образом, чтобы он пренебрегал неизвестными свойствами:

    Java
    Скопировать код
     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  2. Сколько игнорировать неизвестных свойств можно с помощью аннотации @JsonIgnoreProperties прямо в классе: это позволит вам просто игнорировать свойства, которые вам еще не встречались:

    Java
    Скопировать код
     @JsonIgnoreProperties(ignoreUnknown = true)

Визуализация

Предположим, вы используете Jackson для того, чтобы создать сериализованное представление объекта. Это можно сравнить с фотографированием объекта:

Markdown
Скопировать код
📷 -> { "property1": "value1", "property2": "value2", "property3": "value3" }

Если же вы хотите скрыть определенное свойство, это можно сравнить с уборкой этого свойства из зоны видимости фотокамеры:

plaintext
Скопировать код
🔮🙅‍♂️ "property2"

Применяя аннотацию @JsonIgnoreProperties, вы, по сути, накладываете на камеру фильтр, который исключает это свойство из результата:

plaintext
Скопировать код
Фильтр камеры (📸🔲) = @JsonIgnoreProperties(value = { "property2" })

В итоге, сериализованный объект будет без свойства property2:

Markdown
Скопировать код
📸🔲 -> { "property1": "value1", "property3": "value3" }

Применение миксинов и фильтров в сериализации

Заглобальный контроль миксином

Jackson предоставляет возможность создать общее правило для множества классов. Это можно сделать с помощью setMixInResolver и реализации интерфейса MixInResolver, что позволяет динамически определять миксины для различных классов.

Java
Скопировать код
@JsonIgnoreProperties({"unwantedGlobalProperty"})
abstract class GlobalPropertyIgnoreMixIn {}

mapper.setMixInResolver(new SimpleMixInResolver(null) {
    @Override
    public Class<?> findMixInClassFor(Class<?> cls) {
        return GlobalPropertyIgnoreMixIn.class;
    }
});

Динамическое управление сериализацией при помощи JsonFilter

JsonFilter добавляет больше гибкости в управление выводом сериализованных данных:

  1. Определите фильтр:

    Java
    Скопировать код
     @JsonFilter("yourFilter")
     abstract class YourBean {}
  2. Настройте правила фильтрации:

    Java
    Скопировать код
     SimpleFilterProvider filters = new SimpleFilterProvider().addFilter("yourFilter",
         SimpleBeanPropertyFilter.serializeAllExcept("propertyToIgnore"));
  3. Примените фильтр с использованием ObjectWriter:

    Java
    Скопировать код
     ObjectWriter writer = mapper.writer(filters);

Руководство по настройке десериализации

Не забывайте также о возможности использования аннотаций @JsonCreator и @JsonProperty для дополнительной настройки процесса десериализации:

Java
Скопировать код
class CustomDeserialized {
    private String property1;

    @JsonCreator
    public CustomDeserialized(@JsonProperty("property1") String prop1) {
        this.property1 = prop1;
    }
}

Полезные материалы

  1. JsonIgnore (Jackson-annotations 2.7.0 API) — документация по аннотации @JsonIgnore в Jackson.
  2. Пользовательская сериализация и десериализация в Jackson — статья об особенностях пользовательской сериализации и десериализации данных.
  3. Фильтрация в Jackson – использование SimpleFilterProvider — обучающие материалы по применению фильтров в Jackson для исключения свойств при сериализации.
  4. Руководство по Java 8 Optional – для работы со свойствами — путеводитель по использованию Java 8 Optional, который пригодится при работе со значениями null.
  5. Полиморфная десериализация в Jackson – для продвинутых случаев использования — обзор возможностей полиморфной десериализации данных в Jackson.