Игнорировать нулевые поля с Джексоном в Java и Spring Boot

Значения 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 аннотация на уровне класса или на уровне метода.

Отметка времени:

Больше от Стекабьюс