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:

The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5
Các kiểu dữ liệu trong java
Java Program to Implement AttributeList API
Reversing a Linked List in Java
Serialization và Deserialization trong java
Java Program to Implement Wagner and Fisher Algorithm for online String Matching
New Features in Java 8
Java Program to Use Dynamic Programming to Solve Approximate String Matching
How to use the Spring FactoryBean?
Java Program to Implement Hash Tables with Double Hashing
Java Program to Implement Quick Sort Using Randomization
CharSequence vs. String in Java
The Registration Process With Spring Security
Spring Boot Change Context Path
Comparing Long Values in Java
Hướng dẫn Java Design Pattern – MVC
Java Program to Implement Gale Shapley Algorithm
Remove All Occurrences of a Specific Value from a List
Adding Parameters to HttpClient Requests
Java String Conversions
How to Remove the Last Character of a String?
Java Program to Perform Optimal Paranthesization Using Dynamic Programming
Java Program to Implement CopyOnWriteArraySet API
Java Program to Perform Postorder Recursive Traversal of a Given Binary Tree
Java Program to Implement the Edmond’s Algorithm for Maximum Cardinality Matching
Java Program to Implement Bit Array
Java Program to Implement Binomial Tree
Kiểu dữ liệu Ngày Giờ (Date Time) trong java
Handling URL Encoded Form Data in Spring REST
Hướng dẫn Java Design Pattern – Template Method
Java Web Services – JAX-WS – SOAP
Concurrent Test Execution in Spring 5