Jackson - Unmarshall to Collection / Array

1. Información general

Este tutorial mostrará cómo deserializar una matriz JSON a una matriz o colección Java con Jackson 2 .

Si desea profundizar y aprender otras cosas interesantes que puede hacer con Jackson 2 , diríjase al tutorial principal de Jackson.

2. Unmarshall to Array

Jackson puede deserializar fácilmente a una matriz Java:

@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. Desmontar a la colección

Leer la misma matriz JSON en una colección Java es un poco más difícil; de forma predeterminada, Jackson no podrá obtener la información completa del tipo genérico y, en su lugar, creará una colección de instancias de Linked HashMap :

@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)); }

Hay dos formas de ayudar a Jackson a comprender el tipo de información correcto : podemos usar la TypeReference proporcionada por la biblioteca para este mismo propósito:

@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)); }
    

O podemos usar el método readValue sobrecargado que acepta un JavaType :

@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)); }

Una nota final es que la clase MyDto debe tener el constructor predeterminado no-args; si no lo tiene, Jackson no podrá instanciarlo :

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. Conclusión

La asignación de matrices JSON a colecciones java es una de las tareas más comunes para las que se utiliza Jackson, y estas soluciones son vitales para lograr una asignación correcta y segura de tipos .

La implementación de todos estos ejemplos y fragmentos de código se puede encontrar en nuestro proyecto GitHub ; este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar tal como está.