ג'קסון - Unmarshall לאוסף / מערך

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

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

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

2. Unmarshall למערך

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

@Test public void givenJsonArray_whenDeserializingAsArray_thenCorrect () זורק את JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = ObjectMapper חדש (); List listOfDtos = Lists.newArrayList (MyDto חדש ("a", 1, נכון), MyDto חדש ("bc", 3, false)); מחרוזת jsonArray = mapper.writeValueAsString (listOfDtos); // [{"stringValue": "a", "intValue": 1, "booleanValue": true}, // {"stringValue": "bc", "intValue": 3, "booleanValue": false}] MyDto [] asArray = mapper.readValue (jsonArray, MyDto []. class); assertThat (asArray [0], instanceOf (MyDto.class)); }

3. Unmarshall לאוסף

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

@Test הציבור בטל שניתן JsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect () זורק JsonParseException, JsonMappingException, IOException {ממפה ObjectMapper = חדש ObjectMapper (); List listOfDtos = Lists.newArrayList (MyDto חדש ("a", 1, נכון), MyDto חדש ("bc", 3, false)); מחרוזת jsonArray = mapper.writeValueAsString (listOfDtos); רשימת asList = mapper.readValue (jsonArray, List.class); assertThat ((Object) asList.get (0), instanceOf (LinkedHashMap.class)); }

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

@Test ציבור בטל שניתןJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect () זורק JsonParseException, JsonMappingException, IOException {ממפה ObjectMapper = ObjectMapper חדש (); List listOfDtos = Lists.newArrayList (MyDto חדש ("a", 1, נכון), MyDto חדש ("bc", 3, false)); מחרוזת jsonArray = mapper.writeValueAsString (listOfDtos); רשימת asList = mapper.readValue (jsonArray, TypeReference חדש() {}); assertThat (asList.get (0), instanceOf (MyDto.class)); }

או שאנחנו יכולים להשתמש בעומס יתר readValue שיטה המקבלת א JavaType:

@Test publi בטל givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect () זורק JsonParseException, JsonMappingException, IOException {ממפה ObjectMapper = ObjectMapper חדש (); List listOfDtos = Lists.newArrayList (MyDto חדש ("a", 1, נכון), MyDto חדש ("bc", 3, false)); מחרוזת jsonArray = mapper.writeValueAsString (listOfDtos); CollectionType javaType = mapper.getTypeFactory () .constructCollectionType (List.class, MyDto.class); רשימת asList = mapper.readValue (jsonArray, javaType); assertThat (asList.get (0), instanceOf (MyDto.class)); }

הערה אחרונה היא כי MyDto בכיתה צריך להיות בונה ברירת המחדל ללא ארגונים - אם לא, ג'קסון לא יוכל לייצר את זה:

com.fasterxml.jackson.databind.JsonMappingException: לא נמצא קונסטרוקטור מתאים לסוג [סוג פשוט, מחלקה org.baeldung.jackson.ignore.MyDto]: לא מצליח ליצור מיידי מאובייקט JSON (צריך להוסיף / לאפשר מידע על סוג?)

4. מסקנה

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

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


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