Jackson – Unmarshall to Collection/Array

1. Overview

This tutorial will show how to deserialize a JSON Array to a Java Array or Collection with Jackson 2.

If you want to dig deeper and learn other cool things you can do with the Jackson 2 – head on over to the main Jackson tutorial.

2. Unmarshall to Array

Jackson can easily deserialize to a Java Array:

@Test
public void givenJsonArray_whenDeserializingAsArray_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
 
    ObjectMapper mapper = new ObjectMapper();
    List<MyDto> 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 to Collection

Reading the same JSON Array into a Java Collection is a bit more difficult – by default, Jackson will not be able to get the full generic type information and will instead create a collection of LinkedHashMap instances:

@Test
public void givenJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
 
    ObjectMapper mapper = new ObjectMapper();

    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

    List<MyDto> asList = mapper.readValue(jsonArray, List.class);
    assertThat((Object) asList.get(0), instanceOf(LinkedHashMap.class));
}

There are two ways to help Jackson understand the right type information – we can either use the TypeReference provided by the library for this very purpose:

@Test
public void givenJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
 
    ObjectMapper mapper = new ObjectMapper();

    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

    List<MyDto> asList = mapper.readValue(
      jsonArray, new TypeReference<List<MyDto>>() { });
    assertThat(asList.get(0), instanceOf(MyDto.class));
}

Or we can use the overloaded readValue method that accepts a JavaType:

@Test
public void givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();

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

One final note is that the MyDto class needs to have the no-args default constructor – if it doesn’t, Jackson will not be able to instantiate it:

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

4. Conclusion

Mapping JSON arrays to java collections is one of the more common tasks that Jackson is used for, and these solutions are vital to getting to a correct, type-safe mapping.

The implementation of all these examples and code snippets can be found in our GitHub project – this is a Maven-based project, so it should be easy to import and run as it is.

Related posts:

Java Program to Implement Hamiltonian Cycle Algorithm
Spring Boot - Unit Test Cases
Java Program to Check whether Graph is a Bipartite using BFS
Java Program to Implement Depth-limited Search
Spring Boot - Logging
Read an Outlook MSG file
Java Program to Perform Naive String Matching
Quick Intro to Spring Cloud Configuration
Hướng dẫn Java Design Pattern – Template Method
Java Perform to a 2D FFT Inplace Given a Complex 2D Array
Giới thiệu Google Guice – Binding
Finding the Differences Between Two Lists in Java
Java Program to Create a Random Linear Extension for a DAG
Java Program to Find Minimum Number of Edges to Cut to make the Graph Disconnected
Java Program to Generate Date Between Given Range
Circular Dependencies in Spring
Java Program to Create a Minimal Set of All Edges Whose Addition will Convert it to a Strongly Conne...
Java Program to Compute the Volume of a Tetrahedron Using Determinants
Spring REST API + OAuth2 + Angular (using the Spring Security OAuth legacy stack)
Java Program to Implement Dijkstra’s Algorithm using Set
A Guide to Apache Commons Collections CollectionUtils
Java Program to Optimize Wire Length in Electrical Circuit
@Order in Spring
Java Program to Implement Euler Circuit Problem
Thao tác với tập tin và thư mục trong Java
Java Program to Implement Min Heap
Tạo ứng dụng Java RESTful Client với thư viện OkHttp
Spring Boot - Google Cloud Platform
Java Program to Find Hamiltonian Cycle in an UnWeighted Graph
Guide to Character Encoding
Toán tử trong java
Java Program to Implement Branch and Bound Method to Perform a Combinatorial Search