जावा और स्प्रिंग बूट में जैक्सन के साथ नल फ़ील्ड पर ध्यान न दें

सॉफ्टवेयर विकास और उचित हैंडलिंग में शून्य मान बहुत अधिक उत्पन्न होते हैं null मूल्यों को अपने आप में एक विज्ञान में बदला जा सकता है। जैक्सन जावा वस्तुओं के क्रमांकन और अक्रमांकन के लिए वास्तविक पुस्तकालय है - और एक सामान्य परिदृश्य उन वस्तुओं को क्रमबद्ध करने से संबंधित है जिनके पास है null फ़ील्ड्स.

इस छोटे से ट्यूटोरियल में, हम देखेंगे कि जैक्सन के साथ POJO को क्रमबद्ध करते समय आप कैसे अशक्त क्षेत्रों को अनदेखा कर सकते हैं।

ऑब्जेक्टमैपर सेटिंग्स बदलना

जैक्सन का ऑब्जेक्टमैपर केंद्रीय एपीआई है जो वस्तुओं को क्रमबद्ध मूल्यों पर मैप करता है। स्वाभाविक रूप से, आप विभिन्न झंडों के माध्यम से इसके काम करने के तरीके को समायोजित और अनुकूलित कर सकते हैं, जिनमें से एक है:

objectMapper.setSerializationInclusion(Include.NON_NULL);

इस मैपर के साथ क्रमबद्ध करते समय, गुण केवल तभी शामिल किए जाएंगे जब वे गैर-शून्य हों।

यह झंडा सेट करता है दुनिया भर में किसी भी वस्तु के साथ क्रमबद्ध होने के लिए objectMapper उदाहरण। यदि आप स्प्रिंग बूट के साथ काम कर रहे हैं, और जिस ऑब्जेक्टमैपर पर वह निर्भर है, वह उजागर नहीं हुआ है, तो आप ध्वज को इसमें बदल सकते हैं application.properties फ़ाइल:

spring.jackson.default-property-inclusion = non_null

या, यदि आप उपयोग कर रहे हैं application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

नोट: स्प्रिंग के पुराने संस्करणों का इस्तेमाल किया गया spring.jackson.serialization-inclusion=non_null के बजाय spring.jackson.default-property-inclusion=non_null.

वैकल्पिक रूप से, आप डिफ़ॉल्ट को वापस छील सकते हैं ObjectMapper एक नया दर्ज करके उदाहरण @Primary @Bean, नाम objectMapper(), जो डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करता है और उदाहरण पर पूर्ण अनुकूलन की अनुमति देता है जिसका उपयोग डिफ़ॉल्ट रूप से क्रमबद्ध और deserializing के दौरान किया जाएगा:

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

इस @Bean में जाना चाहिए कोई फ़ाइल यह के साथ एनोटेट किया गया है @Configuration एनोटेशन, और अक्सर या तो एक विशेष कॉन्फ़िगरेशन वर्ग या स्प्रिंग बूट एप्लिकेशन के मुख्य वर्ग में स्थित होता है।

जैक्सन2ऑब्जेक्टमैपरबिल्डर इंस्टेंस को बदलना

वसंत का उपयोग करता है HttpMessageConverters HTTP संदेशों और वस्तुओं के बीच कनवर्ट करने के लिए। डिफ़ॉल्ट कन्वर्टर्स हैं ObjectMapper और XmlMapper के माध्यम से तत्काल उदाहरण Jackson2ObjectMapperBuilder.

मैन्युअल रूप से प्राथमिक प्रदान करने के बजाय ObjectMapper (बिल्डर द्वारा प्रदान किए गए को बदलकर), आप स्प्रिंग को निर्देश दे सकते हैं कैसे बनाना है इसके बजाय ऑब्जेक्ट मैपर। यह स्प्रिंग को निचले स्तर की वस्तुओं के साथ छेड़छाड़ किए बिना अपने उच्च-स्तरीय कॉन्फ़िगरेशन को करने की अनुमति देता है, जबकि अभी भी इसके काम करने के तरीके को अनुकूलित करता है। इसके अतिरिक्त, आप इसे अनुकूलित भी कर सकते हैं XmlMapper इस तरह एक बार में।

बिल्डर को कस्टमाइज़ करने के लिए, आप एक नया रजिस्टर करें @Bean of Jackson2ObjectMapperBuilderCustomizer प्रकार, जो बिल्डर को अनुकूलित और लौटाता है:

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

@JsonInclude एनोटेशन

स्पेक्ट्रम के दूसरे छोर पर, हम कम-कोड विकल्प के रूप में एनोटेशन का उपयोग कर सकते हैं! एनोटेशन को क्लास-लेवल या मेथड-लेवल पर लागू किया जा सकता है:

@JsonInclude(JsonInclude.Include.NON_NULL)

यह आपको ऑब्जेक्ट मैपर के वैश्विक व्यवहार के बजाय केवल कुछ वर्गों को अनुकूलित करने की अनुमति देता है।

सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!

नोट: जैक्सन 2.0 के अनुसार, एनोटेशन का मान है JsonInclude.Include.NON_NULL. पुराने संस्करणों के लिए, उपयोग करें include=JsonSerialize.Inclusion.NON_NULL.

@Json कक्षा-स्तर पर शामिल करें

जब आप आवेदन करेंगे @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 मूल्य क्रमबद्ध नहीं किया जाएगा।

@Jsonविधि-स्तर पर शामिल करें

वैकल्पिक रूप से, आप एनोटेशन को विधि-स्तर पर सबसे बारीक विकल्प के रूप में लागू कर सकते हैं:

@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 खेत।

निष्कर्ष

इस गाइड में, आपने सीखा कि कैसे जावा और स्प्रिंग बूट के साथ जैक्सन में रिक्त क्षेत्रों को अनदेखा करना है। यह विश्व स्तर पर अंतर्निहित निहित की जगह प्राप्त किया जा सकता है ObjectMapper उदाहरण और आपके द्वारा पंजीकृत नए प्राथमिक बीन के व्यवहार को अनुकूलित करना।

वैकल्पिक रूप से, आप अनुकूलित कर सकते हैं Jackson2ObjectMapperBuilder जो बनाता है ObjectMapper आपके आवेदन के लिए पहले से निर्मित एक को बदलने के बजाय। कम-कोड समाधान के लिए - आप इसे बदल सकते हैं spring.jackson.default-property-inclusion आपकी संपत्ति फ़ाइलों में संपत्ति।

अंत में - आप का उपयोग कर सकते हैं @JsonInclude क्लास-लेवल या मेथड-लेवल पर एनोटेशन।

समय टिकट:

से अधिक स्टैकब्यूज