Jackson - Unmarshall to Collection / Array

1. Oversikt

Denne opplæringen viser hvordan du gjør det deserialisere en JSON Array til en Java Array eller samling med Jackson 2.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med Jackson 2 - gå videre til hovedveiledningen for Jackson.

2. Unmarshall to Array

Jackson kan enkelt deserialisere til en Java Array:

@Test offentlig ugyldighet gittJsonArray_whenDeserializingAsArray_thenCorrect () kaster JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = ny ObjectMapper (); List listOfDtos = Lists.newArrayList (new MyDto ("a", 1, true), new MyDto ("bc", 3, false)); String 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 til samling

Å lese den samme JSON Array i en Java-samling er litt vanskeligere - som standard, Jackson vil ikke kunne få full generisk informasjon og oppretter i stedet en samling av kobledeHashMap forekomster:

@Test offentlig ugyldighet gittJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect () kaster JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (new MyDto ("a", 1, true), new MyDto ("bc", 3, false)); String jsonArray = mapper.writeValueAsString (listOfDtos); Liste asList = mapper.readValue (jsonArray, List.class); assertThat ((Object) asList.get (0), instanceOf (LinkedHashMap.class)); }

Det er to måter å hjelpe Jackson med å forstå riktig type informasjon - vi kan enten bruke Type Referanse levert av biblioteket for nettopp dette formålet:

@Test offentlig ugyldighet gittJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect () kaster JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (new MyDto ("a", 1, true), new MyDto ("bc", 3, false)); String jsonArray = mapper.writeValueAsString (listOfDtos); Liste asList = mapper.readValue (jsonArray, ny TypeReference() {}); assertThat (asList.get (0), instanceOf (MyDto.class)); }

Eller vi kan bruke overbelastet readValue metode som godtar en JavaType:

@Test publi ugyldig gittJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect () kaster JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (new MyDto ("a", 1, true), new MyDto ("bc", 3, false)); String jsonArray = mapper.writeValueAsString (listOfDtos); CollectionType javaType = mapper.getTypeFactory () .constructCollectionType (List.class, MyDto.class); Liste asList = mapper.readValue (jsonArray, javaType); assertThat (asList.get (0), instanceOf (MyDto.class)); }

En siste merknad er at MyDto klassen må ha standardkonstruktøren no-args - hvis den ikke gjør det, Jackson vil ikke kunne instantiere det:

com.fasterxml.jackson.databind.JsonMappingException: Ingen passende konstruktører funnet for type [enkel type, klasse org.baeldung.jackson.ignore.MyDto]: kan ikke starte fra JSON-objekt (trenger å legge til / aktivere typeinformasjon?)

4. Konklusjon

Kartlegging av JSON-arrays til java-samlinger er en av de vanligste oppgavene som Jackson brukes til, og disse løsningene er avgjørende for å komme til en korrekt, typesikker kartlegging.

Implementeringen av alle disse eksemplene og kodebiter kan du finne i GitHub-prosjektet vårt - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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