Jackson - Unmarshall to Collection / Array

1. Overzicht

Deze tutorial laat zien hoe deserialiseer een JSON-array naar een Java-array of -collectie met Jackson 2.

Als je dieper wilt graven en leren andere coole dingen die je kunt doen met de Jackson 2 - ga naar de belangrijkste Jackson-tutorial.

2. Unmarshall aan Array

Jackson kan gemakkelijk deserialiseren naar een Java-array:

@Test openbare leegte gegevenJsonArray_whenDeserializingAsArray_thenCorrect () gooit JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (nieuwe MyDto ("a", 1, true), nieuwe 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. Marshall voor collectie

Het lezen van dezelfde JSON-array in een Java-verzameling is een beetje moeilijker - standaard, Jackson zal niet in staat zijn om de volledige algemene type-informatie te krijgen en zal in plaats daarvan een verzameling LinkedHash kaart gevallen:

@Test openbare leegte gegevenJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect () gooit JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (nieuwe MyDto ("a", 1, true), nieuwe MyDto ("bc", 3, false)); String jsonArray = mapper.writeValueAsString (listOfDtos); Lijst asList = mapper.readValue (jsonArray, List.class); assertThat ((Object) asList.get (0), instanceOf (LinkedHashMap.class)); }

Er zijn twee manieren om help Jackson de juiste type-informatie te begrijpen - we kunnen ofwel de TypeReference voor dit doel ter beschikking gesteld door de bibliotheek:

@Test openbare leegte gegevenJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect () gooit JsonParseException, JsonMappingException, IOException {ObjectMapper mapper = new ObjectMapper (); List listOfDtos = Lists.newArrayList (nieuwe MyDto ("a", 1, true), nieuwe MyDto ("bc", 3, false)); String jsonArray = mapper.writeValueAsString (listOfDtos); Lijst asList = mapper.readValue (jsonArray, nieuw TypeReference() {}); assertThat (asList.get (0), instanceOf (MyDto.class)); }

Of we kunnen de overbelaste gebruiken readValue methode die een JavaType:

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

Een laatste opmerking is dat de MyDto klasse moet de standaardconstructor no-args hebben - als dat niet het geval is, Jackson zal het niet kunnen instantiëren:

com.fasterxml.jackson.databind.JsonMappingException: Geen geschikte constructor gevonden voor type [eenvoudig type, klasse org.baeldung.jackson.ignore.MyDto]: kan niet instantiëren vanuit JSON-object (moet type-informatie worden toegevoegd / ingeschakeld?)

4. Conclusie

Het toewijzen van JSON-arrays aan Java-verzamelingen is een van de meest voorkomende taken waarvoor Jackson wordt gebruikt, en deze oplossingen zijn essentieel om tot een correcte, typeveilige mapping te komen.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in ons GitHub-project - dit is een op Maven gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.


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