В этом руководстве мы рассмотрим, как преобразовать строку 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
}
Естественно, ключевым классом Джексона является класс ObjectMapper
-
основной API для объектно-связанной привязки данных библиотеки.
Подобно тому, как вы сопоставляете значения JSON с другими типами, для
преобразования содержимого 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()
, и, поскольку он содержит JSON, который
можно десериализовать в карту , с учетом пар ключ-значение , Джексон
сказал десериализовать его в HashMap
. Выполнение этого кода приводит
к:
[Task 2=Done, Task 1=In_Progress, Task 3=Planned]
Теперь, поскольку HashMap
не сохраняет порядок вставки , вы можете
LinkedHashMap
, если порядок вставки важен для вас:
Map<String, TASK_STATUS> result = objectMapper.readValue(json, LinkedHashMap.class);
Это приводит к:
[Task 1=In_Progress, Task 2=Done, Task 3=Planned]
Альтернативой JavaType
было бы использование TypeReference
от
Джексона:
Map<String, TASK_STATUS> result = objectMapper.readValue(json,
new TypeReference<LinkedHashMap>(){});
Теперь печать этой карты также приведет к:
[Task 1=In_Progress, Task 2=Done, Task 3=Planned]
Оба они создают объект, вызывая один и тот же процесс десериализации.
Таким образом, единственная разница между этими двумя вызовами
заключается в том, делаете ли вы статическую ( JavaType
) или
динамическую ( TypeReference
) ссылку на тип.