Convierta una cadena JSON en un mapa de Java con Jackson

En este tutorial, veremos cómo convertir una cadena JSON en un mapa Java con Jackson, con ejemplos.

En este tutorial, veremos cómo convertir una cadena JSON en un mapa Java usando jackson, una biblioteca de enlace de datos extremadamente popular. para Java.

Específicamente, trabajaremos con este objeto JSON:

1
2
3
4
5
{
"Task 1" : "In_Progress",
"Task 2" : "Done",
"Task 3" : "Planned"
}

Como estamos trabajando con una biblioteca externa, agreguemos la dependencia requerida. Si está utilizando Maven, puede agregarlo a su proyecto con:

1
2
3
4
5
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.3</version>
</dependency>

O si está usando Gradle, puede agregar:

1
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.3'

Convertir cadena JSON en mapa Java

Para nuestras etiquetas de estado de tareas, definamos un Enum. Tendremos un par Map<String, TASK_STATUS>, sin embargo, puedes elegir cualquier tipo aquí, de verdad:

1
2
3
enum TASK_STATUS {
    In_Progress, Done, Planned
}

Naturalmente, la clase clave de Jackson es la clase ObjectMapper, la API principal para el enlace de datos relacionados con objetos de la biblioteca.

Al igual que asignaría valores JSON a otros tipos, para convertir contenido JSON en un mapa Java, utilizará el método readValue() de la instancia ObjectMapper, que lo deserializa en la referencia de clase proporcionada:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
String json = "{\n" +
               "\"Task 1\" : \"In_Progress\",\n" +
               "\"Task 2\" : \"Done\",\n" +
               "\"Task 3\" : \"Planned\"\n" +
               "}";

// ObjectMapper instantiation
ObjectMapper objectMapper = new ObjectMapper();

// Deserialization into a Map
Map<String, TASK_STATUS> result = objectMapper.readValue(json, HashMap.class);
        
// Printing the results
System.out.println(result.entrySet());

Hemos arrojado el contenido json al método readValue(), y dado que contiene JSON que puede deserializarse en un mapa, dadas las parejas clave-valor, le dijimos a Jackson que deserializara en un HashMap. Ejecutar este código da como resultado:

1
[Task 2=Done, Task 1=In_Progress, Task 3=Planned]

Ahora, dado que HashMaps no conservan el orden de inserción, es posible que desee utilizar un LinkedHashMap en su lugar, si el orden de inserción es importante para usted:

1
Map<String, TASK_STATUS> result = objectMapper.readValue(json, LinkedHashMap.class);

Esto resulta en:

1
[Task 1=In_Progress, Task 2=Done, Task 3=Planned]

Una alternativa a especificar JavaType directamente sería usar la clase TypeReference de Jackson:

1
2
Map<String, TASK_STATUS> result = objectMapper.readValue(json, 
            new TypeReference<LinkedHashMap>(){});

Ahora, imprimir este mapa también dará como resultado:

1
[Task 1=In_Progress, Task 2=Done, Task 3=Planned]

Ambos construyen un objeto llamando exactamente al mismo proceso de deserialización. Entonces, la única diferencia entre estas dos llamadas es si está haciendo una referencia estática (JavaType) o dinámica (TypeReference) al tipo.