Преобразуем строку JSON в карту Java с помощью Jackson

В этом уроке мы рассмотрим, как преобразовать строку JSON в карту Java с помощью Jackson, чрезвычайно популярной библиотеки привязки данных для Java.

В частности, мы будем работать с этим объектом JSON:

{
"Task 1" : "In-Progress",
"Task 2" : "Done",
"Task 3" : "Planned"
}

Поскольку мы работаем с внешней библиотекой, давайте добавим необходимую зависимость. Если вы пользуетесь Maven, можете добавить его в свой проект так:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.3</version>
</dependency>

Если же вы используете Gradle, вы можете сделать так:

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

Преобразуем строки JSON в карту Java

Для наших меток статуса задачи опишем Enum. У нас будет пара Map<String, TASK_STATUS>, хотя можете выбрать любой тип:

enum TASK_STATUS {
    In_Progress, Done, Planned
}

Ключевым классом Jackson считается класс ObjectMapper – основной API для привязки данных библиотеки, связанных с объектами.

Для преобразования содержимого JSON в карту Java нужно использовать метод readValue() экземпляра ObjectMapper, который десериализует его в предоставленную ссылку на класс:

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());

Мы поместили содержимое json в метод readValue(). Выполнение этого кода приводит к:

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

Поскольку хэш-карты не сохраняют порядок вставки, вы можете вместо этого использовать связанную хэш-карту, если порядок вставки для вас важен:

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

Результат:

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

Альтернативой непосредственному указанию JavaType было бы использование TypeReference из Jackson:

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

Результат:

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

Они оба создают объект, вызывая один и тот же процесс десериализации. Таким образом, единственное различие между этими двумя вызовами заключается в том, делаете ли вы статическую (JavaType) или динамическую (TypeReference) ссылку на тип.

Ответить