Nilai nol banyak muncul dalam pengembangan perangkat lunak, dan penanganan yang tepat dari null
nilai-nilai dapat diubah menjadi ilmu itu sendiri. Jackson adalah perpustakaan de-facto untuk serialisasi dan deserialisasi objek Java - dan skenario umum berkaitan dengan serialisasi objek yang memiliki null
bidang.
Dalam tutorial singkat ini, kita akan melihat bagaimana Anda dapat mengabaikan bidang nol saat membuat serial POJO dengan Jackson.
Mengubah Pengaturan ObjectMapper
ObjectMapper Jackson adalah API pusat yang memetakan objek ke nilai berseri. Secara alami, Anda dapat menyesuaikan dan menyesuaikan cara kerjanya melalui berbagai flag, salah satunya adalah:
objectMapper.setSerializationInclusion(Include.NON_NULL);
Saat membuat serial dengan mapper ini, properti hanya akan disertakan jika bukan nol.
Ini menetapkan bendera global untuk objek apa pun yang diserialkan dengan objectMapper
contoh. Jika Anda bekerja dengan Spring Boot, dan ObjectMapper yang diandalkannya tidak terbuka, Anda dapat mengubah bendera di application.properties
File:
spring.jackson.default-property-inclusion = non_null
Atau, jika Anda menggunakan application.yml
:
spring:
jackson:
default-property-inclusion: non_null
Catatan: Versi Spring yang lebih lama digunakan spring.jackson.serialization-inclusion=non_null
alih-alih spring.jackson.default-property-inclusion=non_null
.
Atau, Anda dapat mengupas kembali mengganti default ObjectMapper
contoh dengan mendaftarkan yang baru @Primary
@Bean
, bernama objectMapper()
, yang menggantikan implementasi default dan memungkinkan penyesuaian penuh atas instance yang akan digunakan secara default saat membuat serial dan deserializing:
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
Kredensial mikro @Bean
harus masuk ke file apa saja itu dijelaskan dengan @Configuration
anotasi, dan seringkali terletak di kelas konfigurasi khusus atau kelas utama aplikasi Boot Musim Semi.
Mengubah Instance Jackson2ObjectMapperBuilder
Musim semi menggunakan HttpMessageConverters
untuk mengkonversi antara pesan HTTP dan objek. Konverter default adalah ObjectMapper
dan XmlMapper
contoh yang dipakai melalui Jackson2ObjectMapperBuilder
.
Alih-alih menyediakan yang utama secara manual ObjectMapper
(mengganti yang disediakan oleh pembuat), Anda dapat menginstruksikan Spring on cara membangun objek mapper sebagai gantinya. Ini memungkinkan Spring untuk melakukan konfigurasi tingkat tinggi tanpa Anda merusak objek tingkat rendah, sambil tetap menyesuaikan cara kerjanya. Selain itu, Anda juga dapat menyesuaikan XmlMapper
cara ini dalam sekali jalan.
Untuk menyesuaikan pembangun, Anda mendaftarkan yang baru @Bean
of Jackson2ObjectMapperBuilderCustomizer
type, yang mengkustomisasi dan mengembalikan builder:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
return builder -> {
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
@JsonSertakan Anotasi
Di ujung lain spektrum, kita dapat menggunakan anotasi, sebagai alternatif kode rendah! Anotasi dapat diterapkan di tingkat kelas atau tingkat metode:
@JsonInclude(JsonInclude.Include.NON_NULL)
Hal ini memungkinkan Anda untuk menyesuaikan hanya kelas tertentu, bukan perilaku global pemetaan objek.
Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!
Catatan: Pada Jackson 2.0, nilai anotasinya adalah JsonInclude.Include.NON_NULL
. Untuk versi sebelumnya, gunakan include=JsonSerialize.Inclusion.NON_NULL
.
@JsonSertakan di Tingkat Kelas
Saat Anda melamar @JsonInclude
di tingkat kelas, anotasi meluas ke semua pengambil dan penyetel:
@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;
}
Setiap bidang tertentu yang memiliki null
nilai tidak akan diserialkan.
@JsonInclude pada Metode-Level
Atau, Anda dapat menerapkan anotasi pada tingkat metode sebagai opsi paling terperinci:
@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;
}
Dalam cuplikan ini โ anotasi hanya diterapkan pada TransactionType
lapangan.
Kesimpulan
Dalam panduan ini, Anda telah mempelajari cara mengabaikan bidang nol di Jackson, dengan Java dan Spring Boot. Ini dapat dicapai secara global dengan menggantikan implisit yang mendasarinya ObjectMapper
contoh dan menyesuaikan perilaku kacang utama baru yang Anda daftarkan.
Atau, Anda dapat menyesuaikan Jackson2ObjectMapperBuilder
yang membangun ObjectMapper
untuk aplikasi Anda alih-alih mengganti yang sudah dibuat. Untuk solusi kode rendah โ Anda dapat mengubah spring.jackson.default-property-inclusion
properti di file properti Anda.
Akhirnya โ Anda dapat menggunakan @JsonInclude
anotasi pada tingkat kelas atau tingkat metode.