Исключение null и пустых значений при сериализации в Jackson
Быстрый ответ
Если вы хотите исключить null и пустые значения при сериализации, используйте аннотацию @JsonInclude(JsonInclude.Include.NON_EMPTY)
на уровне класса:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class MyClass {
private String prop; // Игнорируем, если нет свойства
// ...
}
В качестве альтернативы можно применить настройку ObjectMapper для общего решения:
ObjectMapper mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
Как первый, так и второй варианты исключат из итогового JSON поля с значением null или считающиеся пустыми (такими как пустые строки или коллекции).
Управление конкретными полями
Если вам требуется управлять отдельными полями, можно использовать аннотацию @JsonInclude на уровне поля:
public class AnotherClass {
@JsonInclude(JsonInclude.Include.NON_NULL)
private String importantField; // Здесь null недопустимый 😉
private String anotherField;
// ...
}
В этом случае поле importantField
будет исключено из сериализованного представления, если его значение null, а anotherField
останется неизменным.
Обработка вложенных POJO-классов
Не забудьте аннотировать и вложенные POJO-классы правильным образом:
@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
:
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class LegacyClass {
private String legacyProp; // Это эхо прошлого
// ...
}
Такое использование аннотации стало устаревшим начиная с версий Jackson 2.x и новее, но остается актуальным для предыдущих версий.
Решение сложных проблем с сериализацией
Если в процессе возникают сложности, проверьте наличие конфликтов с другими аннотациями, обращайте внимание на корректность импорта необходимых классов, а также на возможные ошибки в коде.
Визуализация
Перед сериализацией 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 для решения проблем
Иногда что-то может не работать так, как задумано, и проблему можно решить, обновив библиотеку до последней версии. После обновления всегда проверяйте совместимость.
Полезные материалы
- Настройки сериализации в JSON с Jackson: игнорирование null полей — детализированная информация о настройках сериализации в Jackson.
- Аннотация @JsonInclude для свойств Jackson — официальная документация по использованию аннотации
@JsonInclude
. - Документация Jackson 2.x – обработка JSON — глубокий материал по обработке JSON в Jackson.
- Примеры использования @JsonInclude для управления сериализацией полей Jackson — практическое руководство по использованию аннотации
@JsonInclude
. - Аннотации @JsonSerialize и @JsonDeserialize в Jackson — руководство по пользовательской сериализации и десериализации.
- Стратегии Jackson для игнорирования null и пустых полей — обсуждение на Stack Overflow о настройках игнорирования (ссылка, возможно, устарела и требует обновления).