Автор оригинала: David Landup.
Вступление
Файлы 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
Синтаксис действительно прост, словарь (наша сущность сотрудника) представлен с помощью <ключ>: <значение> .
После определения нескольких свойств, таких как имя , заработная плата и должность , снова включается список с отступом от каждого элемента списка, начинающегося с - .
Каждый из этих элементов также может быть словарем:
---
name: David
wage: 1500
position: Developer
colleagues:
- name: Martha
wage: 1500
position: Developer
- name: Jim
wage: 1800
position: DevOps Engineer
Вы можете сократить словари и сформировать более сложные коллекции, хотя это выходит за рамки данного руководства.
После обновления на YAML мы готовы написать некоторый код, который считывает/записывает файлы YAML. Для достижения этой цели мы можем использовать любую из двух популярных библиотек: Jackson или SnakeYaml . В этой статье мы сосредоточимся на Джексоне .
Чтение YAML с Джексоном
Jackson – чрезвычайно популярная библиотека на основе Java, используемая для анализа и управления файлами JSON и XML .
Излишне говорить, что это также позволяет нам анализировать файлы YAML и манипулировать ими аналогично тому, как мы уже привыкли делать с двумя ранее упомянутыми форматами.
Используя Jackson в качестве нашей библиотеки, мы находимся в знакомой среде, и многие приложения Java уже используют 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
Мы сопоставим этот файл с экземпляром нашего Сотрудника класса, используя класс Джексона ObjectMapper :
// Loading the YAML file from the /resources folder
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
File file = new File(classLoader.getResource("person.yaml").getFile());
// Instantiating a new ObjectMapper as a YAMLFactory
ObjectMapper om = new ObjectMapper(new YAMLFactory());
// Mapping the employee from the YAML file to the Employee class
Employee employee = om.readValue(file, Employee.class);
// Printing out the information
System.out.println("Employee info " + employee.toString());
// Access the first element of the list and print it as well
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
Наш человек.файл yaml был сопоставлен с экземпляром объекта, который мы затем можем использовать по назначению.
Написание YAML с Джексоном
С чтением и отображением в стороне, давайте также продолжим запись в файл YAML.
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
В отличие от использования метода readValue () , мы будем использовать метод writeValue () , указывающий, где будет находиться результирующий файл и объект, из которого мы сопоставляем файл YAML.
Давайте создадим экземпляр сотрудника и присвоим ему некоторые значения:
Listcolleagues = 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)); // We want to save this Employee in a YAML file Employee employee = new Employee("David", 1500, "Developer", colleagues); // ObjectMapper is instantiated just like before ObjectMapper om = new ObjectMapper(new YAMLFactory()); // We write the `employee` into `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 Джексоном.
Вывод
Файлы в формате YAML становятся все более популярными для определения свойств инструментов и приложений благодаря удобочитаемому синтаксису. Помимо того, что они содержат свойства конфигурации, они также все чаще используются для передачи данных, подобно тому, как используется JSON, хотя их использование в этой области все еще не так распространено в дикой природе.
Jackson – чрезвычайно популярная библиотека на основе Java, используемая для анализа и управления файлами JSON и XML . Кроме того, он был расширен, чтобы разработчики могли также работать с форматом файла YAML.