Чтение и запись YAML файлов на Java с Jackson
YAML файлы в настоящее время широко используются для определения свойств инструментов и приложений из-за очень удобочитаемого синтаксиса.
Помимо содержания свойств конфигурации, они также часто используются для передачи / сериализации данных, подобно тому, как используется JSON.
Чтение и запись файлов YAML быстро становится основным навыком разработчика, подобно тому, как чтение и запись файлов JSON и XML.
Что такое YAML?
YAML - это не другой язык разметки (YAML) - это простой, понятный человеку язык сериализации данных, очень похожий на JSON. Его легче читать и понимать, и он может ссылаться на другие элементы в файле YAML, а также встраивать в себя другие форматы, такие как JSON и XML.
Он не предназначен для замены существующих решений и в основном используется для конфигурационных файлов, поскольку его легко читать и редактировать, а также поддерживаются комментарии, что делает его более удобным для команды.
Большинство файлов YAML можно преобразовать в JSON, и наоборот, поскольку YAML является расширенным набором JSON. Вот пример файла YAML:
--- #Employee Info
name: David
wage: 1500
position: Developer
techstack:
- Java
- Spring
- Hibernate
Синтаксис действительно прост, словарь (наша сущность сотрудника) представлен как key: value
.
После определения нескольких свойств , таких как name
, wage
и position
, список включается, опять же , с отступом с каждым элементом списка , начиная с -
.
Каждый из этих элементов также может быть словарем:
---
name: David
wage: 1500
position: Developer
colleagues:
- name: Martha
wage: 1500
position: Developer
- name: Jim
wage: 1800
position: DevOps Engineer
Вы можете сократить словари и сформировать более сложные коллекции, хотя это выходит за рамки данного руководства.
Чтение YAML с Jackson
Jackson - чрезвычайно популярная библиотека на основе Java, используемая для анализа и манипулирования файлами JSON и XML.
Излишне говорить, что это также позволяет нам анализировать и манипулировать файлами YAML аналогично тому, как мы уже привыкли работать с двумя ранее упомянутыми форматами.
Используя Jackson в качестве нашей библиотеки, мы находимся в знакомой среде, и во многих Java-приложениях в любом случае уже есть Jackson для других целей.
Во-первых, давайте добавим Jackson в наш проект через Maven:
com.fasterxml.jackson.core
jackson-dataformat-yaml
{$version}
com.fasterxml.jackson.core
jackson-databind
{$version}
Нам понадобится jackson-databind
из которого мы извлечем класс ObjectMapper
, и зависимость jackson-dataformat-yaml
, из которой мы извлечем класс YAMLFactory
.
Как и в случае с JSON и XML, основным классом, который мы будем использовать для этой задачи, будет класс ObjectMapper
. Его метод readValue()
используется для отображения источника (файл YAML) в результат (объект класса).
Давайте сначала определим простой класс, который мы хотели бы отобразить. Что касается предыдущего примера YAML, давайте создадим класс Employee
:
public class Employee {
public Employee(String name, int wage, String position, List colleagues) {
this.name = name;
this.wage = wage;
this.position = position;
this.colleagues = colleagues;
}
// Without a default constructor, Jackson will throw an exception
public Employee() {}
private String name;
private int wage;
private String position;
private List colleagues;
// Getters and setters
@Override
public String toString() {
return "\nName: " + name + "\nWage: " + wage + "\nPosition: " + position + "\nColleagues: " + colleagues + "\n";
}
Теперь мы будем читать файл YAML, скажем person.yaml
, с содержимым:
---
name: David
wage: 1500
position: Developer
colleagues:
- name: Martha
wage: 1500
position: Developer
- name: Jim
wage: 1800
position: DevOps Engineer
Мы сопоставим этот файл с экземпляром нашего класса Employee
, используя класс ObjectMapper
:
// Загрузка файла YAML из папки
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
File file = new File(classLoader.getResource("person.yaml").getFile());
// Создание нового ObjectMapper как YAMLFactory
ObjectMapper om = new ObjectMapper(new YAMLFactory());
// Отображение сотрудника из файла YAML в класс Employee
Employee employee = om.readValue(file, Employee.class);
// Распечатка информации
System.out.println("Employee info " + employee.toString());
// Получите доступ к первому элементу списка и распечатайте его
System.out.println("Accessing first element: " + employee.getColleagues().get(0).toString());
Выполнение этого фрагмента кода даст нам:
Employee info
Name: David
Wage: 1500
Position: Developer
Colleagues: [
Name: Martha
Wage: 1500
Position: Developer
Colleagues: null
,
Name: Jim
Wage: 1800
Position: DevOps Engineer
Colleagues: null
]
Accessing first element:
Name: Martha
Wage: 1500
Position: Developer
Colleagues: null
Наш person.yaml
файл был сопоставлен с экземпляром объекта, который мы затем можем использовать для любых целей.
Запись YAML с Jackson
В отличие от использования метода readValue()
, мы будем использовать метод writeValue()
, определяющий, где будет конечный файл и объект, из которого мы сопоставляем файл YAML.
Давайте создадим экземпляр сотрудника и назначим несколько значений:
List colleagues = new ArrayList();
colleagues.add(new Employee("Mary", 1800, "Developer", null));
colleagues.add(new Employee("Jane", 1200, "Developer", null));
colleagues.add(new Employee("Tim", 1600, "Developer", null));
colleagues.add(new Employee("Vladimir", 1000, "Developer", null));
// Мы хотим сохранить этого сотрудника в файле YAML
Employee employee = new Employee("David", 1500, "Developer", colleagues);
// ObjectMapper создается так же, как и раньше
ObjectMapper om = new ObjectMapper(new YAMLFactory());
// Мы пишем `employee` в` person2.yaml`
om.writeValue(new File("/src/main/resources/person2.yaml"), employee);
Выполнение этого фрагмента кода даст нам YAML-файл с содержимым:
---
name: "David"
wage: 1500
position: "Developer"
colleagues:
- name: "Mary"
wage: 1800
position: "Developer"
colleagues: null
- name: "Jane"
wage: 1200
position: "Developer"
colleagues: null
- name: "Tim"
wage: 1600
position: "Developer"
colleagues: null
- name: "Vladimir"
wage: 1000
position: "Developer"
colleagues: null
Как вы можете видеть, Java-объект employee
был сериализован в файл в формате YAML.
Вывод
Файлы с форматированием YAML становятся все более популярными для определения свойств инструментов и приложений из-за очень удобочитаемого синтаксиса. Помимо того, что они содержат свойства конфигурации, они также все чаще используются для передачи данных, подобно тому, как используется JSON, хотя их использование в этой области все еще не так распространено в дикой природе.
Jackson - чрезвычайно популярная библиотека на основе Java, используемая для анализа и манипулирования файлами JSON и XML. Кроме того, он был расширен, чтобы позволить разработчикам также работать с форматом файла YAML.