Ігноруйте нульові поля з Jackson у Java та Spring Boot

Нульові значення часто виникають під час розробки програмного забезпечення та належного поводження з ними null цінності можна перетворити на науку саму по собі. Jackson — це фактична бібліотека для серіалізації та десеріалізації об’єктів Java, і типовий сценарій стосується серіалізації об’єктів, які мають null поля.

У цьому короткому посібнику ми розглянемо, як можна ігнорувати нульові поля під час серіалізації POJO за допомогою Джексона.

Зміна налаштувань ObjectMapper

ObjectMapper Джексона — це центральний API, який відображає об’єкти на серіалізовані значення. Природно, ви можете налаштувати та налаштувати спосіб роботи за допомогою різних прапорців, один із яких:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Під час серіалізації за допомогою цього відтворювача властивості будуть включені, лише якщо вони не нульові.

Це встановлює прапор глобально для будь-якого об’єкта, який серіалізується за допомогою objectMapper екземпляр. Якщо ви працюєте з Spring Boot, і ObjectMapper, на який він покладається, не розкритий, ви можете змінити прапорець у application.properties Файл:

spring.jackson.default-property-inclusion = non_null

Або, якщо ви використовуєте application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Примітка: Використовувалися старіші версії Spring spring.jackson.serialization-inclusion=non_null замість spring.jackson.default-property-inclusion=non_null.

Крім того, ви можете відновити заміну за замовчуванням ObjectMapper екземпляр, зареєструвавши новий @Primary @Bean, Названий objectMapper(), який замінює реалізацію за замовчуванням і дозволяє повністю налаштувати примірник, який використовуватиметься за замовчуванням під час серіалізації та десеріалізації:

@Bean
@Primary
public ObjectMapper objectMapper() {
    return new ObjectMapper()
      .setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

це @Bean слід увійти будь-який файл це анотовано з @Configuration анотація, і часто знаходиться або в спеціалізованому класі конфігурації, або в основному класі програми Spring Boot.

Зміна екземпляра Jackson2ObjectMapperBuilder

Весна використовує HttpMessageConverters для перетворення між повідомленнями HTTP та об’єктами. Перетворювачами за замовчуванням є ObjectMapper та XmlMapper екземпляри, створені через Jackson2ObjectMapperBuilder.

Замість ручного надання основного ObjectMapper (замінюючи наданий будівельником), ви можете доручити Spring як будувати натомість програму відображення об’єктів. Це дозволяє Spring виконувати свої високорівневі конфігурації без втручання в об’єкти нижчого рівня, водночас налаштовуючи спосіб роботи. Крім того, ви також можете налаштувати XmlMapper таким чином за один раз.

Щоб налаштувати конструктор, ви зареєструєте новий @Bean of Jackson2ObjectMapperBuilderCustomizer тип, який налаштовує та повертає конструктор:

@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
    return builder -> {
      builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    }
}

Анотація @JsonInclude

З іншого боку спектру ми можемо використовувати анотації як альтернативу з низьким кодом! Анотації можна застосовувати на рівні класу або методу:

@JsonInclude(JsonInclude.Include.NON_NULL)

Це дозволяє вам налаштовувати лише певні класи замість глобальної поведінки засобу відображення об’єктів.

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

Примітка: Починаючи з Jackson 2.0, значення анотації становить JsonInclude.Include.NON_NULL. Для попередніх версій використовуйте include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude на рівні класу

Коли ви звертаєтесь @JsonInclude на рівні класу анотація поширюється на всі геттери та сетери:

@Entity(name="property")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

Будь-яке дане поле, яке має a null значення не буде серіалізовано.

@JsonInclude на рівні методу

Крім того, ви можете застосувати анотацію на рівні методу як найбільш детальну опцію:

@Entity(name="property")
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

У цьому фрагменті – анотація застосована лише до TransactionType поле.

Висновок

У цьому посібнику ви дізналися, як ігнорувати нульові поля в Jackson за допомогою Java і Spring Boot. Цього можна досягти глобально шляхом заміни основного неявного ObjectMapper екземпляр і налаштування поведінки нового основного компонента, який ви реєструєте.

Крім того, ви можете налаштувати Jackson2ObjectMapperBuilder що будує ObjectMapper для вашої програми замість заміни вже створеної. Для рішення з низьким кодом – ви можете змінити spring.jackson.default-property-inclusion у ваших файлах властивостей.

Нарешті – ви можете використовувати @JsonInclude анотація на рівні класу або методу.

Часова мітка:

Більше від Stackabuse