Jackson - Unmarshall zu Sammlung / Array
1. Überblick
Dieses Tutorial zeigt, wie mandeserialize a JSON Array to a Java Array or Collection with Jackson 2 macht.
Wenn Sie tiefer graben undother cool things you can do with the Jackson 2 lernen möchten, gehen Sie zuthe main Jackson tutorial.
2. Unmarshall zu 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äßigJackson will not be able to get the full generic type information und erstellt stattdessen eine Sammlung verknüpfterHashMap-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 fürhelp Jackson understand the right type information - wir können entweder die von der Bibliothek bereitgestelltenTypeReference 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 überladenereadValue-Methode verwenden, dieJavaType 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 KlasseMyDtoden Standardkonstruktor no-args haben muss - wenn dies nicht der Fall ist,Jackson will not be able to instantiate it:
com.fasterxml.jackson.databind.JsonMappingException:
No suitable constructor found for type [simple type, class org.example.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, und diese Lösungenare vital to getting to a correct, type-safe mapping.
Die Implementierung all dieser Beispiele und Codefragmentecan be found in our GitHub project - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.