התעלם מ-Null Fields עם ג'קסון ב-Java ו-Spring Boot

ערכי Null עולים הרבה בפיתוח תוכנה, וטיפול נכון ב null ניתן להפוך ערכים למדע בפני עצמו. ג'קסון היא הספרייה דה-פקטו לסריאליזציה וסידריאליזציה של אובייקטי ג'אווה - ותרחיש נפוץ נוגע לסידור אובייקטים שיש להם null שדות.

במדריך הקצר הזה, נסקור כיצד ניתן להתעלם משדות null בעת ביצוע סידורי POJO עם ג'קסון.

שינוי הגדרות ObjectMapper

ה-ObjectMapper של ג'קסון הוא ה-API המרכזי שממפה אובייקטים לערכים מסודרים. באופן טבעי, אתה יכול להתאים ולהתאים אישית את אופן הפעולה באמצעות דגלים שונים, אחד מהם הוא:

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 לבצע את התצורות שלו ברמה הגבוהה מבלי שתתעסק באובייקטים ברמה נמוכה יותר, תוך התאמה אישית של אופן הפעולה שלו. בנוסף, אתה יכול גם להתאים אישית את XmlMapper בדרך זו במכה אחת.

כדי להתאים אישית את הבונה, אתה רושם חדש @Bean of Jackson2ObjectMapperBuilderCustomizer סוג, המתאים אישית ומחזיר את הבונה:

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

@JsonInclude הערה

בקצה השני של הספקטרום, אנו יכולים להשתמש בהערות, כחלופה דלת קוד! ניתן ליישם הערות ברמת הכיתה או ברמת השיטה:

@JsonInclude(JsonInclude.Include.NON_NULL)

זה מאפשר לך להתאים אישית רק מחלקות מסוימות, במקום ההתנהגות הגלובלית של ממפה האובייקטים.

עיין במדריך המעשי והמעשי שלנו ללימוד Git, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות Git ולמעשה ללמוד זה!

הערה: נכון לג'קסון 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 שדה.

סיכום

במדריך זה, למדת כיצד להתעלם משדות null בג'קסון, עם Java ו-Spring Boot. ניתן להשיג זאת באופן גלובלי בהחלפת המשתמע הבסיסי ObjectMapper מופע והתאמה אישית של ההתנהגות של השעועית הראשית החדשה שאתה רושם.

לחלופין, אתה יכול להתאים אישית את Jackson2ObjectMapperBuilder שבונה את ObjectMapper עבור היישום שלך במקום להחליף את זה שכבר נבנה. לפתרון דל קוד - אתה יכול לשנות את spring.jackson.default-property-inclusion נכס בקבצי הנכסים שלך.

לבסוף - אתה יכול להשתמש ב @JsonInclude הערה ברמת הכיתה או ברמת השיטה.

בול זמן:

עוד מ Stackabuse