Преобразуем строку 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) ссылку на тип.