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

В этом уроке мы рассмотрим, как преобразовать объект JSON в объект Java с помощью Jackson, очень популярной библиотеки привязки данных для Java.
В частности, мы будем работать с этим объектом JSON:
{
"name":"David",
"position":"Software Engineer",
"skilltree":[
"Java",
"Python",
"JavaScript"
],
"address":{
"street":"Street",
"streetNo":"123"
}
}
Так как мы работаем с внешней библиотекой, добавим зависимость. Если вы используете 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'
Создаём пользовательский класс
Сделав это, мы можем создать простой пользовательский класс, чтобы разместить информацию о наших сотрудниках (Employee) из содержимого JSON:
public class Employee {
private String name;
private POSITION position;
private List<String> skilltree;
private Address address;
// Constructors, Getters, Setters, toString()
}
Примечание: если мы хотим, чтобы Jackson автоматически связывал свойства нашего класса и свойства в объекте JSON, они должны иметь одинаковые имена. Мы расскажем о том, как это изменить чуть позже. Вам понадобится пустой конструктор, чтобы создать экземпляр.
Здесь мы используем перечисление, POSITION:
И объект Address:
public class Address {
private String street;
private String streetNo;
// Constructors, Getters and Setters, toString()
}
Конвертируем объект JSON в объект Java
ObjectMapper – центральный класс Jackson. Это основной API для привязки данных, связанных с объектами. Вы будете использовать его всё время при работе с Jackson.
Чтобы конвертировать объект JSON в объект Java, используем метод readValue() экземпляра ObjectMapper, который десериализует его в предоставленную ссылку на класс:
String json = "{ \"name\":\"David\", \"position\":\"SOFTWARE_ENGINEER\", \"skilltree\":[ \"Java\", \"Python\", \"JavaScript\" ], \"address\":{ \"street\":\"Street\", \"streetNo\":\"123\" } }";
ObjectMapper objectMapper = new ObjectMapper();
Employee employee = objectMapper.readValue(json, Employee.class);
System.out.println(employee);
Результат:
Employee{name='David', position=SOFTWARE_ENGINEER, skillTree=[Java, Python, JavaScript], address=Address{street='Street', streetNo='123'}}
Ещё можно использовать TypeReference:
Employee employee = objectMapper.readValue(json, new TypeReference<Employee>(){});
Печать экземпляра employee приведёт к:
Employee{name='David', position=SOFTWARE_ENGINEER, skillTree=[Java, Python, JavaScript], address=Address{street='Street', streetNo='123'}}
Оба они создают объект и вызывают один и тот же процесс десериализации. Единственное различие между ними в том, делаете вы статическую или динамическую ссылку на тип.