ג'קסון - עבודה עם מפות ואפסים

1. סקירה כללית

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

2. התעלם מערכי אפסים במפה

לג'קסון יש דרך פשוטה אך שימושית לשלוט באופן גלובלי במה שקורה לערכי אפס כאשר המפה הופכת לסדרת סדר:

ממפה ObjectMapper = ObjectMapper חדש (); mapper.setSerializationInclusion (Include.NON_NULL);

כעת יתעלם מכל ערך אפס באובייקט Map המסודר באמצעות מיפוי זה:

@Test public void givenIgnoringNullValuesInMap_whenWritingMapObjectWithNullValue_thenIgnored () זורק JsonProcessingException {ObjectMapper mapper = ObjectMapper חדש (); mapper.setSerializationInclusion (Include.NON_NULL); MyDto dtoObject1 = MyDto חדש (); מפה dtoMap = HashMap חדש (); dtoMap.put ("dtoObject1", dtoObject1); dtoMap.put ("dtoObject2", null); מחרוזת dtoMapAsString = mapper.writeValueAsString (dtoMap); assertThat (dtoMapAsString, containString ("dtoObject1")); assertThat (dtoMapAsString, not (containString ("dtoObject2"))); }

3. סדר סדר מפה עם מפתח אפס

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

c.f.j.c.JsonGenerationException: מפתח אפס עבור מפה אסור ב- JSON (השתמש ב- NullKeySerializer להמיר?) בכתובת c.f.j.d.s.i.FailingSerializer.serialize (FailingSerializer.java:36)

הספרייה בכל זאת מספיק גמישה שתוכל להגדיר סידור מפתח מותאם אישית ללא מפתח ולדרוס את התנהגות ברירת המחדל:

class MyDtoNullKeySerializer מרחיב את StdSerializer {public MyDtoNullKeySerializer () {this (null); } MyDtoNullKeySerializer ציבורי (Class t) {super (t); } @Override פומבי בטל סידור (אובייקט nullKey, JsonGenerator jsonGenerator, SerializerProvider לא בשימוש) זורק IOException, JsonProcessingException {jsonGenerator.writeFieldName (""); }}

עכשיו המפה עם מפתח האפס תעבוד בסדר גמור - ומפתח האפס ייכתב כמחרוזת ריקה:

@Test ציבורי בטל givenAllowingMapObjectWithNullKey_whenWriting_thenCorrect () זורק JsonProcessingException {ממפה ObjectMapper = חדש ObjectMapper (); mapper.getSerializerProvider (). setNullKeySerializer (MyDtoNullKeySerializer חדש ()); MyDto dtoObject = MyDto חדש (); dtoObject.setStringValue ("dtoObjectString"); מפה dtoMap = HashMap חדש (); dtoMap.put (null, dtoObject); מחרוזת dtoMapAsString = mapper.writeValueAsString (dtoMap); assertThat (dtoMapAsString, containString ("\" \ ""); assertThat (dtoMapAsString, containString ("dtoObjectString")); }

4. התעלם משדות אפסים

מלבד מפות, ג'קסון מספק הרבה תצורה וגמישות להתעלמות / עבודה איתם ריק שדות באופן כללי. אתה יכול לבדוק את המדריך הזה כדי לראות בדיוק איך זה עובד.

5. מסקנה

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

זה גם מספק הרבה דרכים איתן לעבוד עם אוספים במובן כללי יותר.

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


$config[zx-auto] not found$config[zx-overlay] not found