ג'קסון מתעלם מנכסים על מרשלינג

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

מדריך זה יראה כיצד התעלם משדות מסוימים בעת סדרת אובייקט ל- JSON באמצעות ג'קסון 2.x.

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

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

2. התעלם משדות ברמת הכיתה

אנו יכולים להתעלם משדות ספציפיים ברמת הכיתה, באמצעות ה @JsonIgnoreProperties ביאור וציון השדות לפי שם:

@JsonIgnoreProperties (value = {"intValue"}) מחלקה ציבורית MyDto {private String stringValue; int intalue פרטי; ערך בוליאני פרטי; MyDto ציבורי () {סופר (); } // קובעי וקבצים סטנדרטיים אינם מוצגים}

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

@Test ציבורי בטל givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect () זורק JsonParseException, IOException {ממפה ObjectMapper = ObjectMapper חדש (); MyDto dtoObject = MyDto חדש (); מחרוזת dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, not (containString ("intValue")); }

3. התעלם משדה ברמת השדה

אנו יכולים גם להתעלם משדה ישירות דרך ה @ג'סון התעלם ביאור ישירות על המגרש:

מחלקה ציבורית MyDto {string StringValue פרטי; @JsonIgnore int intalue private; ערך בוליאני פרטי; MyDto ציבורי () {סופר (); } // קובעי וקבצים סטנדרטיים אינם מוצגים}

כעת אנו יכולים לבדוק כי intValue השדה אכן אינו חלק מפלט ה- JSON הסידורי:

@Test ציבור בטל givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect () זורק JsonParseException, IOException {ממפה ObjectMapper = ObjectMapper חדש (); MyDto dtoObject = MyDto חדש (); מחרוזת dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, not (containString ("intValue")); }

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

לבסוף, אנחנו יכולים התעלם מכל השדות מהסוג שצוין, והשתמש ב- @JsonIgnoreType ביאור. אם אנו שולטים בסוג, נוכל להעלות הערה ישירה על הכיתה:

@JsonIgnoreType מחלקה ציבורית SomeType {...}

לעתים קרובות יותר מאשר לא, אין לנו שליטה בכיתה עצמה; במקרה הזה, אנחנו יכולים לעשות שימוש טוב במיקסינים של ג'קסון.

ראשית, אנו מגדירים MixIn עבור הסוג שברצוננו להתעלם ממנו, ומציינים זאת באמצעותו @JsonIgnoreType במקום:

מחלקה ציבורית @JsonIgnoreType MyMixInForIgnoreType {}

ואז נרשום את המיקסין הזה כדי להחליף (ולהתעלם) מכולם חוּט[] סוגים במהלך מרשל:

mapper.addMixInAnnotations (מחרוזת []. class, MyMixInForIgnoreType.class);

בנקודה זו, כל מערכי המיתרים יתעלמו במקום שיועברו ל JSON:

@Test הסופי הציבורי בטל givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect () זורק JsonParseException, IOException {ממפה ObjectMapper = ObjectMapper חדש (); mapper.addMixIn (מחרוזת []. class, MyMixInForIgnoreType.class); MyDtoWithSpecialField dtoObject = MyDtoWithSpecialField חדש (); dtoObject.setBooleanValue (נכון); מחרוזת dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, containString ("intValue")); assertThat (dtoAsString, containString ("booleanValue")); assertThat (dtoAsString, not (containString ("stringValue"))); }

והנה ה- DTO שלנו:

מחלקה ציבורית MyDtoWithSpecialField {private String [] stringValue; int intalue פרטי; ערך בוליאני פרטי; }

הערה: מאז גרסה 2.5 - נראה כי איננו יכולים להשתמש בשיטה זו כדי להתעלם מסוגי נתונים פרימיטיביים, אך אנו יכולים להשתמש בה עבור סוגי נתונים ומערכים מותאמים אישית.

5. התעלם משדות באמצעות מסננים

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

@JsonFilter ("myFilter") מחלקה ציבורית MyDtoWithFilter {...}

לאחר מכן, אנו מגדירים פילטר פשוט שיתעלם מה- intValue שדה:

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider filters = new SimpleFilterProvider () .addFilter ("myFilter", theFilter);

כעת נוכל לסדר את האובייקט ולוודא שה- intValue השדה אינו קיים בפלט JSON:

@Test הסופי הציבורי בטל givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect () זורק JsonParseException, IOException {ממפה ObjectMapper = ObjectMapper חדש (); SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider filters = new SimpleFilterProvider () .addFilter ("myFilter", theFilter); MyDtoWithFilter dtoObject = MyDtoWithFilter חדש (); מחרוזת dtoAsString = mapper.writer (פילטרים) .writeValueAsString (dtoObject); assertThat (dtoAsString, not (containString ("intValue"))); assertThat (dtoAsString, containString ("booleanValue")); assertThat (dtoAsString, containString ("stringValue")); System.out.println (dtoAsString); }

6. מסקנה

המאמר המחיש כיצד להתעלם משדות בסידור - תחילה לפי שם, אחר כך באופן ישיר, ולבסוף - התעלמנו מכל סוג ה- Java באמצעות MixIns ואנו משתמשים במסננים לשליטה רבה יותר בפלט.

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד בפרויקט GitHub שלי.