YAML
YAML | |
---|---|
![]() | |
Расширение | .yaml [1] или .yml [1] |
MIME-тип | application/yaml[2][3][…] |
Разработчик | Кларк Эванс[вд] |
Опубликован | 11 мая 2001[4] |
Последний выпуск | 1.2.2 (1 октября 2021; 2 года назад (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]:
- быть понятным человеку;
- поддерживать структуры данных, родственные для языков программирования;
- быть переносимым между языками программирования;
- использовать цельную модель данных для поддержки обычного инструментария;
- поддерживать потоковую обработку;
- быть выразительным и расширяемым;
- быть лёгким в реализации и использовании.
К текущей редакции 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 2 Polli R., Wilde E., Aro E. YAML Media Type (англ.) — IETF, 2024. — doi:10.17487/RFC9512
- ↑ YAML Media Type
- ↑ https://www.iana.org/assignments/media-types/application/yaml
- ↑ Эванс К. YAML Draft 0.1 — Yahoo!.
- ↑ If YAML ain't markup language, what is it? (англ.). StackOverflow (6 августа 2011). Дата обращения: 15 марта 2021. Архивировано 23 апреля 2021 года.
- ↑ Oren Ben-Kiki, Clark Evans, Brian Ingerson. YAML Ain't Markup Language (YAML™) 1.0 (англ.) (29 января 2004). Дата обращения: 15 марта 2021. Архивировано 6 мая 2021 года.
- ↑ 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.