Преобразование строки JSON в карту Java с помощью Джексона

В этом руководстве мы рассмотрим, как преобразовать строку JSON в карту Java с помощью Jackson [https://github.com/FasterXML/jackson], чрезвычайно популярной библиотеки привязки данных для Java. В частности, мы будем работать с этим объектом JSON: {&quot;Task 1&quot;: &quot;In-Progress&quot;, &quot;Task 2&quot;: &quot;Done&quot;, &quot;Task 3&quot;: &quot;Planned&quot;} Поскольку мы работаем с внешним библиотеку, добавим необходимую зависимость. Если вы используете Maven, вы можете добавить его в свой проект с помощью:<dependency><groupId> com.fast

В этом руководстве мы рассмотрим, как преобразовать строку 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 ) ссылку на тип.

comments powered by Disqus

Содержание