Jackson - Unmarshall to Collection / Array

1. Áttekintés

Ez az oktatóanyag megmutatja, hogyan kell deserializáljon egy JSON tömböt Java tömbbe vagy gyűjteménybe a Jackson 2-vel.

Ha mélyebbre akarsz ásni és tanulni egyéb jó dolgokat tehetsz a Jackson 2-vel - folytassa a Jackson fő oktatóanyaggal.

2. Unmarshall to Array

Jackson könnyen deszerializálódhat Java tömbvé:

@Test public void givenJsonArray_whenDeserializingAsArray_thenCorrect () dobja JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (új MyDto ("a", 1, igaz), új MyDto ("bc", 3, hamis)); Karakterlánc jsonArray = mapper.writeValueAsString (listOfDtos); // [{"stringValue": "a", "intValue": 1, "booleanValue": true}, // {"stringValue": "bc", "intValue": 3, "booleanValue": false}] MyDto [] asArray = mapper.readValue (jsonArray, MyDto []. osztály); assertThat (asArray [0], instanceOf (MyDto.class)); }

3. Unmarshall to Collection

Ugyanaz a JSON tömb elolvasása Java gyűjteménybe kissé nehezebb - alapértelmezés szerint Jackson nem tudja megszerezni a teljes általános típusú információt és ehelyett létrehoz egy Linked gyűjteménytHashMap példányok:

@Test public void givenJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect () dobja JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (új MyDto ("a", 1, igaz), új MyDto ("bc", 3, hamis)); Karakterlánc jsonArray = mapper.writeValueAsString (listOfDtos); Lista asList = mapper.readValue (jsonArray, List.class); assertThat ((Object) asList.get (0), instanceOf (LinkedHashMap.class)); }

Kétféle módon lehet segítsen Jacksonnak megérteni a megfelelő típusú információkat - vagy használhatjuk a TypeReference amelyet a könyvtár adott erre a célra:

@Test public void givenJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect () dobja JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (új MyDto ("a", 1, igaz), új MyDto ("bc", 3, hamis)); Karakterlánc jsonArray = mapper.writeValueAsString (listOfDtos); List asList = mapper.readValue (jsonArray, új TypeReference() {}); assertThat (asList.get (0), instanceOf (MyDto.class)); }

Vagy használhatjuk a túlterheltet readValue módszer, amely elfogadja a JavaType:

@Test publi void givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect () dobja JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (új MyDto ("a", 1, igaz), új MyDto ("bc", 3, hamis)); Karakterlánc jsonArray = mapper.writeValueAsString (listOfDtos); CollectionType javaType = mapper.getTypeFactory () .constructCollectionType (List.class, MyDto.class); List asList = mapper.readValue (jsonArray, javaType); assertThat (asList.get (0), instanceOf (MyDto.class)); }

Egy utolsó megjegyzés, hogy a MyDto osztálynak rendelkeznie kell az no-args alapértelmezett konstruktorral - ha nem, Jackson nem lesz képes példányosítani:

com.fasterxml.jackson.databind.JsonMappingException: Nem található megfelelő kivitelező az [egyszerű típus, osztály org.baeldung.jackson.ignore.MyDto] típushoz: nem tud példányosodni a JSON objektumból (hozzá kell adnia / engedélyeznie kell a típusinformációkat?)

4. Következtetés

A JSON tömbök leképezése a java gyűjtemények közé az egyik leggyakoribb feladat, amelyhez Jackson szolgál, és ezek a megoldások létfontosságúak a helyes, típusbiztos feltérképezéshez.

Mindezen példák és kódrészletek megvalósítása megtalálható a GitHub projektünkben - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.