YAML
| YAML | |
|---|---|
| | |
| | |
|
|
|
| Расширение |
.yaml[1] или .yml[1] |
| MIME-тип | application/yaml[2][3][…] |
| Разработчик | Кларк Эванс[вд] |
| Опубликован | 11 мая 2001[4] |
| Последний выпуск | 1.2.2 (1 октября 2021) |
| Тип формата | Обмен данными |
| Расширен из | 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]:
- быть понятным человеку;
- поддерживать структуры данных, родственные для языков программирования;
- быть переносимым между языками программирования;
- использовать цельную модель данных для поддержки обычного инструментария;
- поддерживать потоковую обработку;
- быть выразительным и расширяемым;
- быть лёгким в реализации и использовании.
К текущей редакции 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": "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 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 года.
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.