Interested Article - YAML
- 2020-12-18
- 1
YAML ( рекурсивный акроним англ. « Y AML A in't M arkup L anguage» — «YAML — не язык разметки») — дружественный формат сериализации данных , концептуально близкий к языкам разметки , но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования .
В трактовке названия отражена история развития: на ранних этапах YAML расшифровывался как Yet Another Markup Language («Ещё один язык разметки») и даже позиционировался как конкурент XML , но позже был переименован с целью акцентировать внимание на данных, а не на разметке документов .
Цели создания
Согласно целям, озвученным Кларком Эвансом ( англ. Clark Evans ), YAML 1.0 призван :
- быть понятным человеку;
- поддерживать структуры данных, родственные для языков программирования ;
- быть переносимым между языками программирования;
- использовать цельную модель данных для поддержки обычного инструментария;
- поддерживать потоковую обработку;
- быть выразительным и расширяемым;
- быть лёгким в реализации и использовании;
К текущей редакции YAML (1.2) в эти цели были внесены некоторые изменения :
- пункты 2 и 3 поменялись местами
- пункт 5 был заменен на «YAML поддерживает обработку в один проход»
Синтаксис
Синтаксис YAML минималистичен, особенно по сравнению с XML -синтаксисом. В спецификации указывают, что большое влияние оказал стандарт . Ниже приведены образцы различных компонентов разметки. Следует заметить, что наличие варианта записи в однострочном формате делает 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 , , Kubernetes (притом поддерживается взаимно-однозначное соответствие с форматом JSON ), , Symfony , , Google App Engine , Dart , Home Assistant .
Примечания
- — Yahoo! .
- (англ.) . StackOverflow (6 августа 2011). Дата обращения: 15 марта 2021. 23 апреля 2021 года.
- Oren Ben-Kiki, Clark Evans, Brian Ingerson. (англ.) (29 января 2004). Дата обращения: 15 марта 2021. 6 мая 2021 года.
- Oren Ben-Kiki, Clark Evans, Ingy döt Net. (1 октября 2009). Дата обращения: 15 марта 2021. 24 января 2019 года.
Ссылки
- (англ.) . — официальный сайт. Дата обращения: 29 ноября 2010. 10 февраля 2012 года.
- . CustisWiki . Заказные ИнформСистемы. Дата обращения: 29 апреля 2006. 10 февраля 2012 года.
- (англ.) . — Валидатор YAML.
- 2020-12-18
- 1