Jackson - Unmarshall til samling / matrix

1. Oversigt

Denne vejledning viser, hvordan man gør det deserialisere en JSON Array til en Java Array eller samling med Jackson 2.

Hvis du vil grave dybere og lære andre seje ting, du kan gøre med Jackson 2 - gå videre til den vigtigste Jackson-tutorial.

2. Unmarshall til Array

Jackson kan let deserialisere til en Java Array:

@Test offentlig ugyldighed givetJsonArray_whenDeserializingAsArray_thenCorrect () kaster JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = ny ObjectMapper (); List listOfDtos = Lists.newArrayList (ny MyDto ("a", 1, sand), ny MyDto ("bc", 3, falsk)); String jsonArray = mapper.writeValueAsString (listOfDtos); // [{"stringValue": "a", "intValue": 1, "booleanValue": true}, // {"stringValue": "bc", "intValue": 3, "booleanValue": false}] MyDto [] asArray = mapper.readValue (jsonArray, MyDto []. klasse); assertThat (asArray [0], instanceOf (MyDto.class)); }

3. Unmarshall til samling

At læse den samme JSON Array i en Java-samling er lidt sværere - som standard Jackson vil ikke være i stand til at få den fulde generiske type information og opretter i stedet en samling af LinkedHashMap tilfælde:

@Test offentlig ugyldighed givetJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect () 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); List asList = mapper.readValue (jsonArray, List.class); assertThat ((Object) asList.get (0), instanceOf (LinkedHashMap.class)); }

Der er to måder at hjælpe Jackson med at forstå den rigtige typeinformation - vi kan enten bruge TypeReference leveret af biblioteket til netop dette formål:

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

Eller vi kan bruge den overbelastede readValue metode, der accepterer en JavaType:

@Test publi ugyldigt givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_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); CollectionType javaType = mapper.getTypeFactory () .constructCollectionType (List.class, MyDto.class); Liste asList = mapper.readValue (jsonArray, javaType); assertThat (asList.get (0), instanceOf (MyDto.class)); }

En sidste bemærkning er, at MyDto klasse skal have no-args standardkonstruktøren - hvis den ikke gør det, Jackson vil ikke være i stand til at instantiere det:

com.fasterxml.jackson.databind.JsonMappingException: Ingen passende konstruktør fundet til type [enkel type, klasse org.baeldung.jackson.ignore.MyDto]: kan ikke instantiere fra JSON-objekt (har brug for at tilføje / aktivere typeoplysninger?)

4. Konklusion

Kortlægning af JSON-arrays til java-samlinger er en af ​​de mere almindelige opgaver, som Jackson bruges til, og disse løsninger er afgørende for at komme til en korrekt, typesikker kortlægning.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i vores GitHub-projekt - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.