Java ve Spring Boot'da Jackson ile Boş Alanları Yoksay

Sıfır değerler, yazılım geliştirmede ve uygun şekilde ele alınmasında çok fazla ortaya çıkar. null değerler başlı başına bir bilime dönüştürülebilir. Jackson, Java nesnelerinin serileştirilmesi ve seri durumdan çıkarılması için fiili kitaplıktır ve ortak bir senaryo, null alanları.

Bu kısa eğitimde, bir POJO'yu Jackson ile serileştirirken boş alanları nasıl yok sayabileceğinize bir göz atacağız.

ObjectMapper Ayarlarını Değiştirme

Jackson'ın ObjectMapper'ı, nesneleri serileştirilmiş değerlere eşleyen merkezi API'dir. Doğal olarak, çeşitli bayraklar aracılığıyla çalışma şeklini ayarlayabilir ve özelleştirebilirsiniz, bunlardan biri:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Bu eşleştiriciyle seri hale getirirken, özellikler yalnızca boş değilse dahil edilir.

Bu bayrağı ayarlar küresel ile seri hale getirilen herhangi bir nesne için objectMapper misal. Spring Boot ile çalışıyorsanız ve güvendiği ObjectMapper açıkta değilse, bayrağı değiştirebilirsiniz. application.properties Dosya:

spring.jackson.default-property-inclusion = non_null

Veya, kullanıyorsanız application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Not: Spring'in eski sürümleri kullanıldı spring.jackson.serialization-inclusion=non_null yerine spring.jackson.default-property-inclusion=non_null.

Alternatif olarak, varsayılanı değiştirebilirsiniz. ObjectMapper örneğin yeni bir kayıt yaparak @Primary @Beanadlı objectMapper()varsayılan uygulamayı geçersiz kılan ve serileştirme ve seri durumdan çıkarma sırasında varsayılan olarak kullanılacak örnek üzerinde tam özelleştirmeye izin veren :

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

Bu @Bean girmeli herhangi bir dosya bu ile açıklamalı @Configuration ek açıklama ve çoğu zaman özel bir yapılandırma sınıfında veya Spring Boot uygulamasının ana sınıfında bulunur.

Jackson2ObjectMapperBuilder Örneğini Değiştirme

Bahar kullanır HttpMessageConverters HTTP mesajları ve nesneler arasında dönüştürmek için. Varsayılan dönüştürücüler, ObjectMapper ve XmlMapper aracılığıyla somutlaştırılan örnekler Jackson2ObjectMapperBuilder.

Birincil bilgileri manuel olarak sağlamak yerine ObjectMapper (oluşturucu tarafından sağlananın yerine), Spring'e talimat verebilirsiniz. nasıl inşa edilir bunun yerine nesne eşleyicisi. Bu, Spring'in üst düzey yapılandırmalarını, alt düzey nesnelerle kurcalamanıza gerek kalmadan, yine de çalışma şeklini özelleştirirken yapmasına olanak tanır. Ek olarak, ayrıca özelleştirebilirsiniz XmlMapper bu şekilde tek seferde.

Oluşturucuyu özelleştirmek için yeni bir @Bean of Jackson2ObjectMapperBuilderCustomizer oluşturucuyu özelleştiren ve döndüren tür:

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

@JsonInclude Ek Açıklama

Yelpazenin diğer ucunda, düşük kodlu bir alternatif olarak ek açıklamaları kullanabiliriz! Açıklamalar, sınıf düzeyinde veya yöntem düzeyinde uygulanabilir:

@JsonInclude(JsonInclude.Include.NON_NULL)

Bu, nesne eşleyicinin genel davranışı yerine yalnızca belirli sınıfları özelleştirmenize olanak tanır.

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

Not: Jackson 2.0'dan itibaren, açıklamanın değeri JsonInclude.Include.NON_NULL. Daha önceki sürümler için şunu kullanın: include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude Sınıf Düzeyinde

Ne zaman başvurursun @JsonInclude sınıf düzeyinde, açıklama tüm alıcıları ve ayarlayıcıları kapsar:

@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;
    
    
}

olan herhangi bir alan null değer serileştirilmeyecek.

@JsonInclude Yöntem Düzeyinde

Alternatif olarak, açıklamayı en ayrıntılı seçenek olarak yöntem düzeyinde uygulayabilirsiniz:

@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;
    
    
}

Bu snippet'te - ek açıklama yalnızca TransactionType alan.

Sonuç

Bu kılavuzda, Java ve Spring Boot ile Jackson'daki boş alanları nasıl yok sayacağınızı öğrendiniz. Bu, küresel olarak elde edilebilir, altta yatan örtük ObjectMapper örnek ve kaydettiğiniz yeni birincil fasulye davranışını özelleştirme.

Alternatif olarak, özelleştirebilirsiniz Jackson2ObjectMapperBuilder bu inşa eder ObjectMapper zaten oluşturulmuş olanı değiştirmek yerine uygulamanız için. Düşük kodlu bir çözüm için - değiştirebilirsiniz. spring.jackson.default-property-inclusion özellik dosyalarınızdaki mülk.

Son olarak - kullanabilirsiniz @JsonInclude sınıf düzeyinde veya yöntem düzeyinde açıklama.

Zaman Damgası:

Den fazla Yığın kötüye kullanımı