YAML (YAML Ain’t Markup Language, YAML не является языком разметки) – это язык сериализации данных. Используется множеством различных инструментов, например Kubernetes, Docker Compose и Ansible Playbooks. Также используется по умолчанию в PHP фреймворке Symfony для конфигурации проектов.
Данная шпаргалка покрывает лишь основные особенности спецификации, поэтому для более подробного ознакомления рекомендуем обратиться к официальной спецификации YAML, а также к статьям на других ресурсах (см. “Источники” в конце документа).
Последнее изменение: 28 августа, 2023 в 21:31
Основные правила
- В качестве отступов используются пробелы.
- YAML регистро-зависимый.
- Расширение файла .yaml или .yml
Ссылки
Комментарии
# однострочный комментарий
a: "test" # комментарий также можно разместить после данных
# многострочные комментарии отсутствуют
# поэтому всегда нужно ставить решетку перед
# началом комментария на новой строке
Типы данных
key1: 123 # целочисленное значение (int)
key2: 1.23 # значение с плавающей запятой (float)
key3: "abc def" # строка
key4: 'abc def' # строка
key5: abc def # строка (кавычки указывать не обязательно)
key6: true # логический тип (boolean)
key7: 2023-08-27 # тип дата (date)
key8: 2023-08-27 23:59:59 # тип дата (date)
key9: !!str 2023-08-27 # принудительное преобразование к строковому типу
Эквивалент в JSON
{
"key1": 123,
"key2": 1.23,
"key3": "abc def",
"key4": "abc def",
"key5": "abc def",
"key6": true,
"key7": "2023-08-27T00:00:00.000Z",
"key8": "2023-08-27T23:59:59.000Z",
"key9": "2023-08-27"
}
Списки и словари
Список (последовательность, массив)
listValue1:
- 123
- "abc"
- test
listValue2: [123, "abc", test]
Эквивалент в JSON
{
"listValue1": [123, "abc", "test"],
"listValue2": [123, "abc", "test"]
}
Многомерный список
listValue1:
- [1, 2, 3]
- [4, 5, 6]
listValue2:
-
- 1
- 2
- 3
-
- 4
- 5
- 6
Эквивалент в JSON
{
"listValue1": [[1, 2, 3], [4, 5, 6]],
"listValue2": [[1, 2, 3], [4, 5, 6]],
}
Словарь (коллекция, хэш-таблица)
dictValue1:
key:
subkey1: 123
subkey2: hello
# в одну строчку
dictValue2: { key: { subkey: true }, key2: hello }
Эквивалент в JSON
{
"dictValue1": {
"key": {
"subkey1": 123,
"subkey2": "hello"
}
},
"dictValue2": {
"key": {
"subkey": true
},
"key2": "hello"
}
}
Список словарей
storage:
- key: 1
value: hello
- key: 2
value: world
Эквивалент в JSON
{
"storage": [
{
"key": 1,
"value": "hello"
},
{
"key": 2,
"value": "world"
}
]
}
Строки
# все \n преобразуются в пробелы
stringValue1:
Строка 1
Строка 2
Строка 3
# символы новой строки сохраняются
stringValue2: |
Строка 1
Строка 2
Строка 3
# добавляет дополнительный символ новой строки
stringValue3: |+
Строка 1
Строка 2
Строка 3
# удаляет последний символ новой строки
stringValue4: |-
Строка 1
Строка 2
Строка 3
# все символы новой строки преобразуются в пробелы,
# кроме последнего
stringValue5: >
Строка 1
Строка 2
Строка 3
Эквивалент в JSON
{
"stringValue1": "Строка 1 Строка 2 Строка 3",
"stringValue2": "Строка 1\nСтрока 2\nСтрока 3\n",
"stringValue3": "Строка 1\nСтрока 2\nСтрока 3\n\n",
"stringValue4": "Строка 1\nСтрока 2\nСтрока 3",
"stringValue5": "Строка 1 Строка 2 Строка 3\n"
}
Несколько документов в одном файле
Каждый документ должен начинаться с разделителя ---
и знака новой строки. Если в файле содержится только один документ, разделитель вставлять не обязательно.
---
# первый документ
key1: value
---
# второй документ
key1: value
Ссылки (алиасы)
a: &refName1
test: value
b: *refName1
listA:
- &refName2 value
- *refName2
listB: &refName3
- 1
- 2
listC: *refName3
- refName1, refName2, refName3 – названия ссылок
&
– задает ссылку*
– извлекает значение по ссылке
Эквивалент в JSON
{
"a": {
"test": "value"
},
"b": {
"test": "value"
},
"listA": ["value", "value"],
"listB": [1, 2],
"listC": [1, 2]
}
Наследование (объединение)
global_properties: &default_properties
subkey:
subvalue1: "hello"
subvalue2: "world"
key: true
my_properties:
<<: *default_properties
key: false
- Задать ссылку (в данном случае
&default_properties
). - Наследовать значение ссылки с помощью
<<: *название_ссылки
. - Переопределить ключи.
Эквивалент в JSON
{
"global_properties": {
"subkey": {
"subvalue1": "hello",
"subvalue2": "world"
},
"key": true
},
"my_properties": {
"subkey": {
"subvalue1": "hello",
"subvalue2": "world"
},
"key": false
}
}
Обратите внимание, что переопределение ключей вложенных словарей приведет к удалению всего словаря целиком.
global_properties: &default_properties
subkey:
subvalue1: "hello"
subvalue2: "world"
key: true
my_properties:
<<: *default_properties
subkey:
subvalue1: "test"
Результат: ключ my_properties.subkey.subvalue2
не существует.
Эквивалент в JSON
{
"global_properties": {
"subkey": {
"subvalue1": "hello",
"subvalue2": "world"
},
"key": true
},
"my_properties": {
"subkey": {
"subvalue1": "test"
},
"key": true
}
}
В качестве решения можно использовать отдельную ссылку на вложенный словарь.
global_subkey: &default_subkey
subvalue1: "hello"
subvalue2: "world"
global_properties: &default_properties
subkey:
<<: *default_subkey
key: true
my_properties:
<<: *default_properties
subkey:
<<: *default_subkey
subvalue1: "test"
Результат: ключ my_properties.subkey.subvalue2
равен "world"
.
Эквивалент в JSON
{
"global_subkey": {
"subvalue1": "hello",
"subvalue2": "world"
},
"global_properties": {
"subkey": {
"subvalue1": "hello",
"subvalue2": "world"
},
"key": true
},
"my_properties": {
"subkey": {
"subvalue1": "test",
"subvalue2": "world"
},
"key": true
}
}