Разработанный Кларком Эвансом, язык YAML (в версии 1.0 эта аббревиатура "официально" расшифровывалась как "Yet Another Markup Language", начиная с 1.1 разработчики решили, что "YAML Ain't Markup Language") первоначально претендовал на роль полноценной замены XML, но затем акцент сместился в сторону максимально гибкого описания данных. Он позволяет наиболее полно отображать основные типы данных, используемых современными языками программирования, сохраняя при этом максимальную простоту как для человека, так и для программного анализа. Wikipedia называет YAML форматом сериализации данных, что очень точно отражает его основную задачу. И действительно, YAML можно с успехом использовать для маршалинга (т.е. для представления данных в памяти, так как формат пригодный для передачи, (см. Маршалинг) или постоянного хранения на диске тех или иных структур данных.
Основные принципы работы с YAML
- всегда используйте UTF-8 во избежание ошибок!
- никогда не используйте TAB для отступов, только пробелы!
Для проверки синтаксиса YAML в Linux можно например использовать yamllint
Форматирование в YAML
Комментарии в YAML
Одно из немногих преимуществ — возможность добавления комментариев. Формат комментирования стандартен — используется #
Добавление комментария допускается в любом месте строки.
Пример:
# I'm comment
- name: somestring
value1: "# I'm not a comment!"
value: anotherstring # another comment
Отступы
Наверное основной недостаток в YAML — отступы. Но это на первое время и со временем привыкаешь!
Во всём файле количество пробелов (не табуляций — только пробелы) в начале строк должно быть одинаковым.
Т.е. если для разделения элементов в одном месте используются два пробела — то во всём файле должны использоваться только два пробела, и никак иначе.
Более того — принято использовать 2 пробела, хотя допустимо любое, главное — одинаковое везде и во всём.
Правильно:
parent_key:
key1: "value1"
key2: "value2"
key3: "%value3"
Неправильно:
parent_key1:
key1: "value1"
key2: "value2"
key3: "%value3"
parent_key2:
key1: "value1"
key2: "value2"
key3: "%value3"
Однострочный YAML
Кроме стандартного вида и разделения пробелами — можно использовать запись в одну строку, аналогично JSON, например:
parent_key: {key1: "value1", key2: "value2"}
Literal Block Scalar
YAML поддерживает возможность записи многострочных строковых блочных скаляров и имеет три варианта их записи — обычный, с помощью разделителя | и >.
Обычный формат будет выглядеть так:
string: This
is
some text
without newlines
При использовании символа | (Literal style) — в значении будут сохранены все символы новой строки и замыкающие пробелы:
string: |
This
is
some text
with newlines
И с помощью > (Folded style):
string: >
This
is
some text
without newlines
Что вернёт весь текст одной строкой + замыкающий символ новой строки.
При этом — вам всё-равно придётся поддерживать равное кол-во пробелов перед каждой строкой в самом YAML-файле.
Базовые форматы данных в YAML
В YAML используются три основных формата:
- scalars: простейший типа ключ:значение
- списки или последовательности (list/sequence): упорядоченные по индексам данные
- словари (dictionary/mapping): схожи со скалярами, но могут иметь вложенные данные в т.ч. других типов
Scalars
Самый простой тип — скаляры, представляющие собой пару ключ:значение
key1: "value1"
key2: "value2"
Использование кавычек для строковых данных категорически рекомендуется во избежание проблем со специальными символами! При этом значения типа true/false и integer можно смело указывать без кавычек.
Списки в YAML
Списки (последовательности, lists, sequences, collections) представляют собой коллекции упорядоченных данных, доступ к которым возможен по их индексам.
Пример списка:
# SIMPLE LIST
- element1
- element2
Вложенные списки
Аналогично примерам выше — списки могут иметь вложенные списки, например:
# SIMPLE LIST
- element1
- element2
# nested list
-
- element1
Именованные списки:
itemname:
- valuename
При этом списки могут содержать скаляры или словари:
itemname:
- valuename
- scalar: "value"
- dict: {item1: "value1", item2: "value2"}
Словари
Словари, они же dictionaries, они же mappings, схожи со cкалярами и содержат пары ключ:значение и, в отличии от скаляров, которые являются элементарным типом — могут содержать вложенные элементы:
key1: "value1"
key2:
- value2
- value3
Или вложенные словари:
key1: "value1"
key2:
- value2
- value3
key3:
key4: "value4"
key5: "value5"
key6:
key7: "value7"