Вступление
Файлы YAML в настоящее время широко используются для определения свойств инструментов и приложений из-за очень удобочитаемого синтаксиса.
Помимо свойств конфигурации, они также часто используются для передачи / сериализации данных, подобно тому, как используется JSON.
Чтение и запись файлов YAML быстро становится базовым навыком разработчика, аналогичным чтению и записи файлов JSON и XML.
Что такое ЯМЛ?
YAML Ain't Markup Language (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, мы готовы написать код, который читает / записывает файлы YAML. Для этого мы можем использовать любую из двух популярных библиотек: Jackson или SnakeYAML . В этой статье мы сосредоточимся на Джексоне .
Чтение YAML с Джексоном
Jackson - чрезвычайно популярная библиотека на основе Java, используемая для анализа и управления файлами JSON и XML.
Излишне говорить, что это также позволяет нам анализировать и управлять файлами YAML аналогично тому, как мы уже привыкли делать с двумя ранее упомянутыми форматами.
Используя Джексон в качестве нашей библиотеки, мы находимся в знакомой среде, и во многих приложениях Java уже есть Джексон для других целей.
Для начала добавим Джексона в наш проект через Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>{$version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>{$version}</version>
</dependency>
Нам нужно как jackson-databind
, из которого мы будем извлекать
ObjectMapper
класс и jackson-dataformat-yaml
зависимость , из
которой мы будем извлекать YAMLFactory
класс.
Как и в случае с JSON и XML, основным классом, который мы будем
использовать для этой задачи, будет класс ObjectMapper
Его
readValue()
используется для сопоставления источника (файла YAML) с
результатом (объектом класса).
Давайте сначала определим простой класс, которому мы хотим сопоставить.
Что касается предыдущего примера YAML, давайте Employee
класс
Employee:
public class Employee {
public Employee(String name, int wage, String position, List<Employee> 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<Employee> 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
:
// 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
Наш person.yaml
был сопоставлен с экземпляром объекта, который мы
затем можем использовать по назначению.
Написание YAML с Джексоном
Разобравшись с чтением и отображением, давайте продолжим и запишем в файл YAML.
В отличие от метода readValue()
, мы будем использовать метод
writeValue()
, указав, где будет конечный файл и объект, из которого
мы сопоставляем файл YAML.
Создадим экземпляр сотрудника и присвоим ему несколько значений:
List<Employee> colleagues = new ArrayList<Employee>();
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
Как видите, employee
Java был сериализован в файл в формате YAML с
использованием поддержки YAML Джексоном.
Заключение
Файлы в формате YAML становятся все более популярными для определения свойств инструментов и приложений из-за очень удобочитаемого синтаксиса. Помимо свойств конфигурации, они также все больше и больше используются для передачи данных, подобно тому, как используется JSON, хотя их использование в этой области все еще не так распространено в дикой природе.
Jackson - чрезвычайно популярная библиотека на основе Java, используемая для анализа и управления файлами JSON и XML. Кроме того, он был расширен, чтобы позволить разработчикам также работать с форматом файлов YAML.