Найти тему
FLEXTYPE

Знакомимся с YAML

Оглавление

Разработанный Кларком Эвансом, язык 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"

Смотрите по теме: