Разработанный Кларком Эвансом, язык YAML (в версии 1.0 эта аббревиатура "официально" расшифровывалась как "Yet Another Markup Language", начиная с 1.1 разработчики решили, что "YAML Ain't Markup Language") первоначально претендовал на роль полноценной замены XML, но затем акцент сместился в сторону максимально гибкого описания данных. Он позволяет наиболее полно отображать основные типы данных, используемых современными языками программирования, сохраняя при этом максимальную простоту как для человека, так и для программного анализа. Wikipedia называет YAML форматом сериализации данных, что очень точно отражает его основную задачу. И действительно, YAML можно с успехом использовать для маршалинга (т.е. для представления данных в памяти, так как формат пригодный для передачи, (см. Маршалинг) или постоянного хранения на диске тех или иных структур данных.

Основные принципы работы с YAML

  • всегда используйте UTF-8 во избежание ошибок!
  • никогда не используйте TAB для отступов, только пробелы!

Валидация YAML

Для проверки синтаксиса 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"

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

Date: 04-01-2021 21:10 Теги: разработка