ג 'קסון Unmarshalling JSON עם נכסים לא ידועים

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

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

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

2. לבטל את המירוש של JSON עם שדות נוספים / לא ידועים

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

לדוגמה, נניח שעלינו לבטל את התוכנה של JSON ליישות Java הבאה:

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

2.1. UnrecognizedPropertyException בשדות לא ידועים

ניסיון לבטל את הרישום של JSON עם מאפיינים לא ידועים ליישות Java הפשוטה הזו יוביל ל- com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

@Test (צפוי = UnrecognisedPropertyException.class) חלל ציבורי שניתן JsonHasUnknownValues_whenDeserializing_thenException () זורק JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," intal, "" "" "" "" נכון, "+" "stringValue2": "משהו"} "; ממפה ObjectMapper = ObjectMapper חדש (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); }

פעולה זו תיכשל למעט החריג הבא:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: שדה לא מזוהה "stringValue2" (class org.baeldung.jackson.ignore.MyDto), לא מסומן כבלתי ניתן לדעת (3 מאפיינים ידועים: "stringValue", "booleanValue", "intValue" ])

2.2. התמודדות עם שדות לא ידועים באמצעות ObjectMapper

כעת נוכל להגדיר את מלוא התצורה ObjectMapper להתעלם ממאפיינים לא ידועים ב- JSON:

ObjectMapper חדש () .configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

אנו אמורים להיות מסוגלים לקרוא JSON מסוג זה לישות Java מוגדרת מראש:

@Test ציבורי בטל שניתןJsonHasUnknownValuesButJacksonIsIgnoringUnknowns_whenDeserializing_thenCorrect () זורק JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," "" "" "" "" ":"משהו"}"; מיפוי ObjectMapper = ObjectMapper חדש () .configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); assertThat (readValue.getIntValue (), equalTo (1)); }

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

אנו יכולים גם לסמן מחלקה אחת כמקבלת שדות לא ידועיםבמקום ג'קסון כולו ObjectMapper:

@JsonIgnoreProperties (ignoreUnknown = true) מחלקה ציבורית MyDtoIgnoreUnknown {...}

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

@Test ציבורי בטל שניתן JsonHasUnknownValuesButIgnoredOnClass_whenDeserializing_thenCorrect () זורק JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," + "" intValue ":" intavalue ":" ":"משהו"}"; ממפה ObjectMapper = ObjectMapper חדש (); MyDtoIgnoreUnknown readValue = מיפוי .readValue (jsonAsString, MyDtoIgnoreUnknown.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); assertThat (readValue.getIntValue (), equalTo (1)); }

3. בטל מרסשל JSON שלם

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

@Test ציבורי בטל givenNotAllFieldsHaveValuesInJson_whenDeserializingAJsonToAClass_thenCorrect () זורק JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," booleanVal; ממפה ObjectMapper = ObjectMapper חדש (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); }

4. מסקנה

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

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

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