Нульові значення часто виникають під час розробки програмного забезпечення та належного поводження з ними 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
анотація на рівні класу або методу.