Для чего используется YAML
Еще один текстовый формат данных — YAML (Yet Another Markup Language, позже — YAML Ain't Markup Language). Используется для сериализации объектов для их передачи по сети (так же, как используется xml и json). За счет удобной читаемости его также используют для написания конфигурационных файлов, например, для Docker, Kubernetes, Ansible, etc. Если YAML нужно сохранить в файл (например, конфигурационный), то используют два расширения: .yaml и .yml.
Синтаксис языка
Для обозначения тегов в xml используют угловые скобки (<>), для JSON — фигурные ({}). Для YAML используют разделители строки (Enter) и отступы (пробелы либо табы).
Данные хранятся в виде key-value пар, где ключом выступает строка, а в качестве значения могут быть разные типы данных: строка, число, true/false, массив... Ключи пишутся без кавычек.
Давай последовательно посмотрим, как в YAML хранится информация:
Тип | Java | YAML |
---|---|---|
Целое число |
|
number: 5 |
Дробное число |
|
number: 4.3 |
Булевая переменная |
|
valid: false
valid: no valid: off * Допустимые булевые значения: true/false, yes/no, on/off. |
Строка |
|
city: Kyiv
city: 'Kyiv' city: "Kyiv" * Все три варианта равнозначны. |
Строка со спецсимволами |
|
line: "aaa\nbbb" |
Комментарий в коде |
|
# comment |
Объект |
* Приведен класс обьекта, чтобы была видна структура объекта. |
person:
name: "Vasyl" age: 32 * Обрати внимание на отступ перед атрибутами. Он должен быть одинаковым для всех атрибутов. |
Список простых значений |
|
ages: [1, 3,5,9,78, -5]
ages: - 1 - 3 - 5 - 9 - 78 - -5 * Оба варианта равнозначные. |
Список объектов |
|
people: - name: "Ivan" age: 21 - name: "Marina" age: 25 - name: "Oleh" age: 73 |
Как и в Java, элементом списка может быть список, то есть объекты можно вкладывать один в другой. Дефис, который определяет очередной элемент списка, может быть смещен по горизонтали относительно родительского ключа, или находится непосредственно под ним. Главное — чтобы все элементы имели одинаковый формат. Это поможет избежать путаницы и неоднозначности с иерархией вложенности.
ages:
- 1 - 3 - 5 - 9 - 78 - -5 |
ages:
- 1 - 3 - 5 - 9 - 78 - -5 |
Есть еще два нюанса при работе с текстовыми значениями:
-
Многострочный текст. Мы можем сохранить текст так:
multilineText: "line 1\nline 2\n....line n"Но читать его будет очень неудобно. Поэтому существует символ | (pipe), при помощи которого можно записать текст иначе:
multilineText: |
line 1
line 2
....
line nСогласись, второй вариант удобнее, верно?
-
Длинные строки. Если текст нужно сохранить в одну строку, но при этом хочется, чтобы он помещался в видимой рабочей области IDE, можно использовать символ > (greater).
singlelineText: >
begin
...
continue same line
...
endВесь текст будет воспринят как одна строка.
Если есть необходимость несколько YAML-структур данных записать в один файл, тогда между ними нужно использовать разделитель — (три дефиса). На практике потребность встречается редко, но лучше знать о таком варианте.
Пример YAML-документа
Давай создадим в Java какую-то структуру данных (класс) и объект этого типа — и попробуем представить данные этого объекта в сериализованном виде в формате YAML.
class Family {
private Date weddingDate;
private Person wife;
private Person husband;
private List<Person> children;
// getters and setters are omitted
}
class Person {
private final String name;
private final boolean isWoman;
private int age;
public Person(String name, int age, boolean isWoman) {
this.name = name;
this.age = age;
this.isWoman = isWoman;
}
// getters and setters are omitted
}
public static void main(String[] args) {
Person wife = new Person("Anya", 37, true);
Person husband = new Person("Alex", 40, false);
var children = List.of(
new Person("Inna", 12, true),
new Person("Olya", 5, true)
);
Date weddingDate = new Date(/*some long*/);
Family family = new Family();
family.setWeddingDate(weddingDate);
family.setWife(wife);
family.setHusband(husband);
family.setChildren(children);
}
Валидное представление в YAML:
weddingDate: 2000-12-03
wife:
name: Anya
age: 37
isWoman: yes
husband:
name: Alex
age: 40
isWoman: no
children:
- name: Inna
age: 12
isWoman: true
- name: Olya
age: 5
isWoman: true
---
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ