Исключение null и пустых значений при сериализации в Jackson

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

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

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

Если вы хотите исключить null и пустые значения при сериализации, используйте аннотацию @JsonInclude(JsonInclude.Include.NON_EMPTY) на уровне класса:

Java
Скопировать код
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class MyClass {
    private String prop; // Игнорируем, если нет свойства
    // ...
}

В качестве альтернативы можно применить настройку ObjectMapper для общего решения:

Java
Скопировать код
ObjectMapper mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

Как первый, так и второй варианты исключат из итогового JSON поля с значением null или считающиеся пустыми (такими как пустые строки или коллекции).

Управление конкретными полями

Если вам требуется управлять отдельными полями, можно использовать аннотацию @JsonInclude на уровне поля:

Java
Скопировать код
public class AnotherClass {
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String importantField; // Здесь null недопустимый 😉
    
    private String anotherField;
    // ...
}

В этом случае поле importantField будет исключено из сериализованного представления, если его значение null, а anotherField останется неизменным.

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

Обработка вложенных POJO-классов

Не забудьте аннотировать и вложенные POJO-классы правильным образом:

Java
Скопировать код
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ParentClass {
    private String name;
    private ChildClass child;

    // Вложенные POJO также требуют аннотаций
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    public static class ChildClass {
        private String childName; // И пустые значения здесь не пропустим
        // ...
    }
    // ...
}

Важность подбора версии Jackson

Для корректной работы аннотации @JsonInclude требуется Jackson версии 2.1.4 и выше. При обновлении библиотеки стоит убедиться в совместимости — могут присутствовать изменения в API.

Демонстрация на примерах

Четкие примеры входных и выходных данных весьма полезны для понимания процесса сериализации и делают вашу документацию более организованной и понятной.

Работа со старыми версиями Jackson

При использовании версий Jackson < 2.x следует использовать аннотацию @JsonSerialize вместо @JsonInclude:

Java
Скопировать код
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class LegacyClass {
    private String legacyProp; // Это эхо прошлого
    // ...
}

Такое использование аннотации стало устаревшим начиная с версий Jackson 2.x и новее, но остается актуальным для предыдущих версий.

Решение сложных проблем с сериализацией

Если в процессе возникают сложности, проверьте наличие конфликтов с другими аннотациями, обращайте внимание на корректность импорта необходимых классов, а также на возможные ошибки в коде.

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

Markdown
Скопировать код
Перед сериализацией Jackson: 
🧍‍♂️(Джон) 🧍‍♀️(пусто) 🧍‍♂️(null) 🧍(Майк)

Стандартная сериализация (без исключения пустых значений и null):
📷 [Джон, 📸, 📸, Майк ]

При использовании `@JsonInclude(Include.NON_EMPTY)`:
📷 [Джон, Майк]

Как опытный фотограф, сериализатор Jackson стремится сохранить только важное, исключая всё ненужное, и предоставляя аккуратное и лаконичное представление данных в формате JSON.

Создание "чистого" JSON с NON_NULL вместо NON_EMPTY

Использование NON_EMPTY исключает пустые строки и коллекции, тогда как NON_NULL исключает только null значения, что делает результат более предсказуемым и понятным.

Детальное управление выводом в API с помощью аннотаций

Аннотации в Jackson — удобный инструмент для контроля данных, передаваемых в API с подпиской. Они позволяют передавать лишь ту информацию, что действительно важна.

Выбор между глобальными и локальными настройками

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

Обновление Jackson для решения проблем

Иногда что-то может не работать так, как задумано, и проблему можно решить, обновив библиотеку до последней версии. После обновления всегда проверяйте совместимость.

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

  1. Настройки сериализации в JSON с Jackson: игнорирование null полей — детализированная информация о настройках сериализации в Jackson.
  2. Аннотация @JsonInclude для свойств Jackson — официальная документация по использованию аннотации @JsonInclude.
  3. Документация Jackson 2.x – обработка JSON — глубокий материал по обработке JSON в Jackson.
  4. Примеры использования @JsonInclude для управления сериализацией полей Jackson — практическое руководство по использованию аннотации @JsonInclude.
  5. Аннотации @JsonSerialize и @JsonDeserialize в Jackson — руководство по пользовательской сериализации и десериализации.
  6. Стратегии Jackson для игнорирования null и пустых полей — обсуждение на Stack Overflow о настройках игнорирования (ссылка, возможно, устарела и требует обновления).