Значения Null часто возникают при разработке программного обеспечения, и правильная обработка null
Ценности могут быть превращены в науку сами по себе. Jackson — де-факто библиотека для сериализации и десериализации объектов Java, и общий сценарий относится к сериализации объектов, которые null
поля.
В этом кратком руководстве мы рассмотрим, как можно игнорировать пустые поля при сериализации POJO с помощью Jackson.
Изменение настроек 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
Spring использует HttpMessageConverters
для преобразования между HTTP-сообщениями и объектами. Преобразователи по умолчанию ObjectMapper
и XmlMapper
экземпляры, созданные с помощью Jackson2ObjectMapperBuilder
.
Вместо того, чтобы вручную указывать первичный ObjectMapper
(заменив предоставленный билдером), вы можете указать Spring на как построить вместо этого сопоставитель объектов. Это позволяет Spring выполнять свои высокоуровневые конфигурации без вашего вмешательства в объекты более низкого уровня, в то же время настраивая способ его работы. Кроме того, вы также можете настроить XmlMapper
таким образом за один раз.
Чтобы настроить конструктор, вы регистрируете новый @Bean
of Jackson2ObjectMapperBuilderCustomizer
type, который настраивает и возвращает билдер:
@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;
}
Любое заданное поле, имеющее 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
instance и настроить поведение нового первичного компонента, который вы регистрируете.
Кроме того, вы можете настроить Jackson2ObjectMapperBuilder
что строит ObjectMapper
для вашего приложения вместо замены уже построенного. Для решения с низким кодом — вы можете изменить spring.jackson.default-property-inclusion
свойство в ваших файлах свойств.
И, наконец, вы можете использовать @JsonInclude
аннотация на уровне класса или на уровне метода.