YAML
YAML (рекурсивный акроним англ. «YAML Ain't Markup Language» — «YAML — не язык разметки») — дружественный формат сериализации данных, концептуально близкий к языкам разметки, но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования. В трактовке названия отражена история развития: на ранних этапах YAML расшифровывался как yet another markup language («ещё один язык разметки») и даже позиционировался как конкурент XML, но позже был переименован с целью акцентировать внимание на данных, а не на разметке документов[5]. Цели созданияСогласно целям, озвученным Кларком Эвансом (англ. Clark Evans), YAML 1.0 призван[6]:
К текущей редакции YAML (1.2) цели были изменены[7]:
СинтаксисСинтаксис 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:
aliases: #последовательность настроек
- &myAlias1
datakey: dataval 1
moredata: morevals 1
- &myAlias2
datakey: dataval 2
moredata: morevals 2
config:
- *myAlias1 # *myAlias1 после парсинга будет заменен на [{"datakey": "dataval 1", "moredata": "morevals 1"}]
ПримерВ некотором проекте нужно хранить конфигурацию[англ.], описывающую отображение (англ. bindings) IRC-команд на функции, с помощью регулярных выражений. Вот исходная конфигурация, представленная в виде таблицы:
В 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 Примечания
Ссылки
|