Jackson - Unmarshall to Collection / Array

1. Übersicht

Dieses Tutorial zeigt, wie Sie ein JSON-Array mit Jackson 2 in ein Java-Array oder eine Java-Sammlung deserialisieren .

Wenn Sie tiefer graben und andere coole Dinge lernen möchten, die Sie mit dem Jackson 2 tun können, besuchen Sie das Haupt-Tutorial von Jackson.

2. Unmarshall to Array

Jackson kann leicht zu einem Java-Array deserialisieren:

@Test public void givenJsonArray_whenDeserializingAsArray_thenCorrect() throws 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); // [{"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 zur Sammlung

Das Einlesen desselben JSON-Arrays in eine Java-Sammlung ist etwas schwieriger. Standardmäßig kann Jackson nicht die vollständigen generischen Typinformationen abrufen und erstellt stattdessen eine Sammlung verknüpfter HashMap- Instanzen:

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

Es gibt zwei Möglichkeiten, um Jackson zu helfen, die richtigen Typinformationen zu verstehen - wir können entweder die von der Bibliothek bereitgestellte TypeReference für diesen Zweck verwenden:

@Test public void givenJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect() throws 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); List asList = mapper.readValue( jsonArray, new TypeReference
    
     () { }); assertThat(asList.get(0), instanceOf(MyDto.class)); }
    

Oder wir können die überladene readValue- Methode verwenden, die einen JavaType akzeptiert :

@Test publi void givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect() throws 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); List asList = mapper.readValue(jsonArray, javaType); assertThat(asList.get(0), instanceOf(MyDto.class)); }

Eine letzte Anmerkung ist, dass die MyDto- Klasse den Standardkonstruktor no-args haben muss - wenn dies nicht der Fall ist, kann Jackson ihn nicht instanziieren :

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class org.baeldung.jackson.ignore.MyDto]: can not instantiate from JSON object (need to add/enable type information?)

4. Fazit

Das Zuordnen von JSON-Arrays zu Java-Sammlungen ist eine der häufigsten Aufgaben, für die Jackson verwendet wird. Diese Lösungen sind für eine korrekte, typsichere Zuordnung von entscheidender Bedeutung .

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in unserem GitHub-Projekt - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.