YAML

YAML
Изображение логотипа
Расширение .yaml[1] или .yml[1]
MIME-тип application/yaml[2][3][…]
Разработчик Кларк Эванс[вд]
Опубликован 11 мая 2001[4]
Последний выпуск 1.2.2 (1 октября 2021; 3 года назад (2021-10-01))
Тип формата Обмен данными
Расширен из XML, Perl и JSON
Открытый формат? Да
Сайт yaml.org (англ.)

YAML (рекурсивный акроним англ. «YAML Ain't Markup Language» — «YAML — не язык разметки») — дружественный формат сериализации данных, концептуально близкий к языкам разметки, но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования.

В трактовке названия отражена история развития: на ранних этапах YAML расшифровывался как yet another markup language («ещё один язык разметки») и даже позиционировался как конкурент XML, но позже был переименован с целью акцентировать внимание на данных, а не на разметке документов[5].

Цели создания

[править | править код]

Согласно целям, озвученным Кларком Эвансом (англ. Clark Evans), YAML 1.0 призван[6]:

  1. быть понятным человеку;
  2. поддерживать структуры данных, родственные для языков программирования;
  3. быть переносимым между языками программирования;
  4. использовать цельную модель данных для поддержки обычного инструментария;
  5. поддерживать потоковую обработку;
  6. быть выразительным и расширяемым;
  7. быть лёгким в реализации и использовании.

К текущей редакции YAML (1.2) цели были изменены[7]:

  • пункты 2 и 3 поменяли местами;
  • пункт 5 заменили на «YAML поддерживает обработку за один проход».

Синтаксис YAML минималистичен, особенно по сравнению с синтаксисом XML. В спецификации указано, что большое влияние на YAML оказал стандарт RFC 822. Ниже приведены образцы различных компонентов разметки. Следует заметить, что наличие варианта записи в однострочном формате делает JSON допустимым подмножеством YAML.

Последовательности (списки)

[править | править код]
 --- # Список фильмов: последовательность в блочном формате  - Casablanca  - Spellbound  - Notorious  --- # Список покупок: последовательность в однострочном формате  [milk, bread, eggs, juice] 

Сопоставления имени и значения (словари)

[править | править код]
 --- # Блочный формат  name: "John Smith"  age: 33  --- # Однострочный формат  {name: "John Smith", age: 33} 

Переводы строк сохраняются

[править | править код]
 --- |    There was a young fellow of Warwick    Who had reason for feeling euphoric        For he could, by election        Have triune erection    Ionic, Corinthian, and Doric 

Переводы строк исчезают

[править | править код]
 --- >    Wrapped text    will be folded    into a single    paragraph        Blank lines denote    paragraph breaks 

Последовательности из сопоставлений

[править | править код]
 - {name: John Smith, age: 33}  - name: Mary Smith    age: 27 

Сопоставления из последовательностей

[править | править код]
 men: [John Smith, Bill Jones]  women:    - Mary Smith    - Susan Williams 

Основные элементы YAML:

  • потоки YAML используют печатаемые Unicode-символы, как UTF-8, так и UTF-16
  • отступы из пробелов (символы табуляции не допускаются) используются для обозначения структуры
  • комментарии начинаются с символа «решётки» (#), могут начинаться в любом месте строки и продолжаются до конца строки
  • списки обозначаются начальным дефисом (-) с одним членом списка на строку, либо члены списка заключаются в квадратные скобки ([ ]) и разделяются запятой и пробелом (, )
  • ассоциативные массивы представлены двоеточием с пробелом (: ) в виде ключ: значение, по одной паре ключ-значение на строку, либо в виде пар, заключённых в фигурные скобки и разделенных запятой и пробелом (, )
    • ключ в ассоциативном массиве может иметь в качестве префикса вопросительный знак (?), что позволяет указать сложный ключ, например представленный в виде списка
  • строки записываются без кавычек, однако могут быть заключены в одиночные или двойные кавычки
    • внутри двойных кавычек могут быть использованы экранированные символы в C-стиле, начинающиеся с обратной косой (\)
  • YAML позволяет задавать подстановки с помощью якорей & и псевдонимов (*). Пример
 aliases:  #последовательность настроек   - &myAlias1     datakey: dataval 1     moredata: morevals 1   - &myAlias2     datakey: dataval 2     moredata: morevals 2  config:   - *myAlias1  # *myAlias1 после парсинга будет заменен на [{"datakey": "dataval 1", "moredata": "morevals 1"}] 
  • явное задание типа оформляется путём '!![указание типа]'. Пример, !!str 100 после разбора выдаст строковое значение «100» вместо целого числа 100.
  • значения типа Дата/Время задаются в формате YYYY-MM-DD или YYYY-MM-DD HH:MM:SS. Если необходимо задать дату как строку, нужно заключать её в кавычки («2012-12-21»)

В некотором проекте нужно хранить конфигурацию[англ.], описывающую отображение (англ. bindings) IRC-команд на функции, с помощью регулярных выражений.

Вот исходная конфигурация, представленная в виде таблицы:

ircEvent method regexp
PRIVMSG newUri "^http://.*"
PRIVMSG deleteUri "^delete.*"
PRIVMSG randomUri "^random.*"

В YAML эта конфигурация может быть представлена следующим образом:

bindings:   - ircEvent: PRIVMSG     method: newUri     regexp: '^http://.*'   - ircEvent: PRIVMSG     method: deleteUri     regexp: '^delete.*'   - ircEvent: PRIVMSG     method: randomUri     regexp: '^random.*' 

или

bindings:    - {ircEvent: PRIVMSG, method: newUri, regexp: '^http://.*'}   - {ircEvent: PRIVMSG, method: deleteUri, regexp: '^delete.*'}   - {ircEvent: PRIVMSG, method: randomUri, regexp: '^random.*'} 

Для сравнения, в XML-представлении данная конфигурация может быть представлена следующим образом:

<bindings>     <binding>         <ircEvent>PRIVMSG</ircEvent>         <method>newUri</method>         <regexp>^http://.*</regexp>     </binding>     <binding>         <ircEvent>PRIVMSG</ircEvent>         <method>deleteUri</method>         <regexp>^delete.*</regexp>     </binding>     <binding>         <ircEvent>PRIVMSG</ircEvent>         <method>randomUri</method>         <regexp>^random.*</regexp>     </binding> </bindings> 

или

<bindings> 	<binding ircEvent="PRIVMSG" method="newUri" regexp="^http://.*" /> 	<binding ircEvent="PRIVMSG" method="deleteUri" regexp="^delete.*" /> 	<binding ircEvent="PRIVMSG" method="randomUri" regexp="^random.*" /> </bindings> 

В совместимом JSON можно выразить это так:

{"bindings":  {"ircEvent|method|regexp":   ["PRIVMSG|newUri|^http://.*",    "PRIVMSG|deleteUri|^delete.*",    "PRIVMSG|randomUri|^random.*"]}} 

Вложенные XML-элементы могут использоваться для отображения произвольных структур, а YAML более близок к отображению типичных моделей данных из Ruby, Perl, Python, Java, позволяя описывать свободные сочетания последовательностей, сопоставлений и скалярных типов — то есть ближе к реальным структурам данных языков программирования, и не требует различных соглашений про DOM-отображения структур данных на документы и обратно, как требуется в XML.

Использование

[править | править код]

Среди программных систем, использующих YAML как формат для файлов конфигурации, — Ruby on Rails, Docker Compose, Kubernetes (притом поддерживается взаимно-однозначное соответствие с форматом JSON), Dancer, Symfony, GAE framework, Google App Engine, Dart, Home Assistant, Ansible

Примечания

[править | править код]
  1. 1 2 Polli R., Wilde E., Aro E. YAML Media Type (англ.)IETF, 2024. — doi:10.17487/RFC9512
  2. YAML Media Type
  3. https://www.iana.org/assignments/media-types/application/yaml
  4. Эванс К. YAML Draft 0.1Yahoo!.
  5. If YAML ain't markup language, what is it? (англ.). StackOverflow (6 августа 2011). Дата обращения: 15 марта 2021. Архивировано 23 апреля 2021 года.
  6. Oren Ben-Kiki, Clark Evans, Brian Ingerson. YAML Ain't Markup Language (YAML™) 1.0 (англ.) (29 января 2004). Дата обращения: 15 марта 2021. Архивировано 6 мая 2021 года.
  7. Oren Ben-Kiki, Clark Evans, Ingy döt Net. YAML Ain’t Markup Language (YAML™) Version 1.2 (1 октября 2009). Дата обращения: 15 марта 2021. Архивировано 24 января 2019 года.
  • YAML.ORG (англ.). — официальный сайт. Дата обращения: 29 ноября 2010. Архивировано 10 февраля 2012 года.
  • YAML. CustisWiki. Заказные ИнформСистемы. Дата обращения: 29 апреля 2006. Архивировано 10 февраля 2012 года.
  • YAML Validator (англ.). — Валидатор YAML.