تجاهل Null Fields مع Jackson في Java و Spring Boot

تظهر القيم الفارغة كثيرًا في تطوير البرامج والتعامل الصحيح معها null يمكن تحويل القيم إلى علم في حد ذاته. جاكسون هي المكتبة الواقعية للتسلسل وإلغاء تسلسل كائنات Java - والسيناريو الشائع يتعلق بتسلسل الكائنات التي تحتوي على null الحقول.

في هذا البرنامج التعليمي القصير ، سنلقي نظرة على كيفية تجاهل الحقول الفارغة عند إجراء تسلسل لـ POJO مع Jackson.

تغيير إعدادات ObjectMapper

يعد ObjectMapper الخاص بـ Jackson واجهة برمجة التطبيقات المركزية التي تعين الكائنات على القيم المتسلسلة. وبطبيعة الحال ، يمكنك ضبط وتخصيص الطريقة التي يعمل بها من خلال العديد من العلامات ، أحدها:

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

يستخدم الربيع HttpMessageConverters للتحويل بين رسائل وكائنات HTTP. المحولات الافتراضية هي ملفات ObjectMapper و XmlMapper الحالات التي تم إنشاء مثيل لها عبر Jackson2ObjectMapperBuilder.

بدلاً من توفير الأساسي يدويًا ObjectMapper (لتحل محل تلك التي قدمها المنشئ) ، يمكنك تشغيل Spring كيف تقوم بالبناء مخطط الكائن بدلاً من ذلك. يسمح هذا لـ Spring بالقيام بتكويناتها عالية المستوى دون العبث بالكائنات ذات المستوى الأدنى ، مع الاستمرار في تخصيص طريقة عملها. بالإضافة إلى ذلك ، يمكنك أيضًا تخصيص ملف XmlMapper بهذه الطريقة دفعة واحدة.

لتخصيص المنشئ ، تقوم بتسجيل ملف @Bean of Jackson2ObjectMapperBuilderCustomizer النوع ، الذي يخصص ويعيد المنشئ:

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

تضمين التعليق التوضيحي

على الطرف الآخر من النطاق ، يمكننا استخدام التعليقات التوضيحية ، كبديل منخفض الكود! يمكن تطبيق التعليقات التوضيحية على مستوى الفصل الدراسي أو مستوى الأسلوب:

@JsonInclude(JsonInclude.Include.NON_NULL)

يسمح لك هذا بتخصيص فئات معينة فقط ، بدلاً من السلوك العام لمخطط الكائن.

تحقق من دليلنا العملي العملي لتعلم 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;
    
    
}

أي مجال محدد يحتوي على الامتداد 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 المثيل وتخصيص سلوك الفول الأساسي الجديد الذي تسجله.

بدلاً من ذلك ، يمكنك تخصيص ملف Jackson2ObjectMapperBuilder الذي يبني ObjectMapper لتطبيقك بدلاً من استبدال التطبيق الذي تم إنشاؤه بالفعل. للحصول على حل منخفض التعليمات البرمجية - يمكنك تغيير spring.jackson.default-property-inclusion الممتلكات في ملفات الممتلكات الخاصة بك.

أخيرًا - يمكنك استخدام ملف @JsonInclude التعليق التوضيحي على مستوى الفصل الدراسي أو مستوى الطريقة.

الطابع الزمني:

اكثر من ستاكابوز