ערכי 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
הערה ברמת הכיתה או ברמת השיטה.