ค่า Null เกิดขึ้นมากมายในการพัฒนาซอฟต์แวร์และการจัดการ .อย่างเหมาะสม null
คุณค่าสามารถเปลี่ยนเป็นวิทยาศาสตร์ในตัวของมันเอง Jackson เป็นไลบรารี de-Facto สำหรับการทำให้เป็นอนุกรมและการดีซีเรียลไลซ์เซชันของอ็อบเจ็กต์ Java – และสถานการณ์สมมติทั่วไปเกี่ยวข้องกับการทำให้เป็นอนุกรมอ็อบเจ็กต์ที่มี null
ทุ่ง.
ในบทช่วยสอนสั้นๆ นี้ เราจะมาดูวิธีที่คุณสามารถละเว้นฟิลด์ null เมื่อทำการซีเรียล POJO กับ Jackson
การเปลี่ยนการตั้งค่า ObjectMapper
ObjectMapper ของ Jackson เป็น API กลางที่แมปวัตถุกับค่าที่เป็นอนุกรม โดยปกติ คุณสามารถปรับและปรับแต่งวิธีการทำงานผ่านแฟล็กต่างๆ ได้ ซึ่งหนึ่งในนั้นคือ:
objectMapper.setSerializationInclusion(Include.NON_NULL);
เมื่อจัดลำดับด้วย mapper นี้ คุณสมบัติจะถูกรวมไว้ก็ต่อเมื่อคุณสมบัติเหล่านั้นไม่เป็นค่าว่าง
สิ่งนี้กำหนดธง ทั่วโลก สำหรับวัตถุใด ๆ ที่ต่อเนื่องกับ 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 on วิธีการสร้าง ตัวแมปวัตถุแทน สิ่งนี้ทำให้ Spring ทำการกำหนดค่าระดับสูงโดยที่คุณไม่ต้องยุ่งเกี่ยวกับวัตถุระดับล่าง ในขณะที่ยังคงปรับแต่งวิธีการทำงาน นอกจากนี้ คุณยังสามารถปรับแต่ง XmlMapper
ด้วยวิธีนี้ในครั้งเดียว
ในการปรับแต่งตัวสร้าง คุณต้องลงทะเบียนใหม่ @Bean
of Jackson2ObjectMapperBuilderCustomizer
ประเภทซึ่งปรับแต่งและส่งคืนตัวสร้าง:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
return builder -> {
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
@Jsonรวมคำอธิบายประกอบ
ในอีกด้านของสเปกตรัม เราสามารถใช้คำอธิบายประกอบเป็นทางเลือกที่มีโค้ดน้อย! สามารถใช้คำอธิบายประกอบที่ระดับคลาสหรือระดับเมธอด:
@JsonInclude(JsonInclude.Include.NON_NULL)
สิ่งนี้ช่วยให้คุณปรับแต่งเฉพาะคลาสบางคลาส แทนที่จะเป็นลักษณะการทำงานส่วนกลางของอ็อบเจ็กต์ mapper
ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling 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
ค่าจะไม่ถูกจัดลำดับ
@JsonIncluded ในระดับวิธีการ
อีกวิธีหนึ่ง คุณสามารถใช้คำอธิบายประกอบที่ระดับวิธีการเป็นตัวเลือกที่ละเอียดที่สุด:
@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;
}
ในตัวอย่างนี้ – คำอธิบายประกอบใช้กับ the . เท่านั้น TransactionType
สนาม
สรุป
ในคู่มือนี้ คุณได้เรียนรู้วิธีละเว้นฟิลด์ว่างใน Jackson ด้วย Java และ Spring Boot สิ่งนี้สามารถทำได้ทั่วโลกโดยแทนที่นัยสำคัญ ObjectMapper
อินสแตนซ์และปรับแต่งพฤติกรรมของ primary bean ใหม่ที่คุณลงทะเบียน
หรือคุณสามารถปรับแต่ง Jackson2ObjectMapperBuilder
ที่สร้าง ObjectMapper
สำหรับแอปพลิเคชันของคุณแทนที่จะแทนที่แอปพลิเคชันที่สร้างไว้แล้ว สำหรับโซลูชันแบบ low-code – คุณสามารถเปลี่ยน spring.jackson.default-property-inclusion
คุณสมบัติในไฟล์คุณสมบัติของคุณ
สุดท้าย – คุณสามารถใช้ the @JsonInclude
คำอธิบายประกอบในระดับคลาสหรือระดับเมธอด