Перейти к содержанию

YAML

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

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

В трактовке названия отражена история развития: на ранних этапах 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 1.029 января 2004
YAML 1.118 января 2005
YAML 1.2.021 июля 2009
YAML 1.2.11 октября 2009
YAML 1.2.21 октября 2021

Синтаксис 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": "PRIVMSG",
      "method": "newUri",
      "regexp": "^http://.*"
    },
    {
      "ircEvent": "PRIVMSG",
      "method": "deleteUri",
      "regexp": "^delete.*"
    },
    {
      "ircEvent": "PRIVMSG",
      "method": "randomUri",
      "regexp": "^random.*"
    }
  ]
}

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

Примечания

[править | править код]
  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 года.