Для конфигурационных файлов существует масса форматов: списки значений, пары «параметр-значение», INI-файлы, YAML, JSON, XML и множество других. Однако по нескольким причинам из всех YAML часто считается особенно трудным. Редакция Highload просто и понятно разъясняет, что такое YAML, а также, какие у него есть возможности/особенности.
Содержание:
1. Что такое YAML
2. Для чего создан YAML
3. Преимущества YAML и примеры использования
4. Отличия YAML от JSON и XML
5. Характерные особенности YAML
6. Синтаксис YAML
Заключение
YAML — это язык сериализации данных. Он удобен для человека и хорошо работает с различными языками программирования, такими как Perl и Python.
YAML расшифровывается как «YAML Ain’t markup language»
YAML создан для упрощения сериализации сложных структур данных. По текущей редакции спецификации YAML v1.2.2 (от 1 октября 2021 года) официальные цели языка таковы:
Вот некоторые общие примеры использования YAML:
Для наглядности приведем примеры описания одной и той же структуры данных на XML, JSON и YAML.
XML
<gas_giants> <gas_giant> <name>Jupiter</name> <mass>1.8982E+27</mass> <mean_radius>69.911</mean_radius> </gas_giant> <gas_giant> <name>Saturn</name> <mass>5.6834E+26</mass> <mean_radius>>58.232</mean_radius> </gas_giant> </gas_giants>
JSON
{ "gas_giants": [ { "name": "Jupiter", "mass": 1.8982E+27, "mean_radius": 69.911 }, { "name": "Saturn", "mass": 5.6834E+26, "mean_radius": 58.232 } ] }
YAML
--- gas_giants: - name: Jupiter mass: 1.8982E+27 mean_radius: 69.911 - name: Saturn mass: 5.6834E+26 mean_radius: 58.232
В коде YAML, как и в Python, используются отступы. Но в YAML эти отступы должны быть пробелами, а табуляция не допускается. Для отступа рекомендуется использовать два пробела. Благодаря этому код читается проще, чем JSON и XML: не мешают скобки и кавычки.
Один файл YAML (*.yaml
, *.yml
) может содержать несколько документов YAML. Каждый документ начинается с трех дефисов.
Если файл содержит лишь один документ, то его необязательно начинать с трех дефисов, но рекомендуется это делать для совместимости с различными парсерами.
В YAML поддерживаются строки без кавычек и с одинарными или двойными кавычками. Даже если ключ словаря состоит из нескольких слов, его не обязательно заключать в кавычки.
Перед значением можно явно указать его тип, например, чтобы трактовать дату как строку.
Ссылки позволяют избежать повторения фрагментов конфигурации.
YAML поддерживает кодировки UTF-8 и UTF-16. Поэтому ключи и значения могут содержать не только латиницу.
В YAML учитывается регистр символов.
Для форматирования структур в YAML используются отступы. Они состоят из пробелов, а табуляция не используется.
Комментарии начинаются с символа «#
», от которого он отделяется пробелом.
Блочный формат
--- # Список: блочный формат - Юпитер - Сатурн - Уран - Нептун
В блочном формате элементы списка начинаются с дефиса и пробела.
Встроенный формат
Во встроенном формате элементы списка разделяются запятыми, за которыми следуют обязательные пробелы. Список заключается в квадратные скобки, как в JSON.
--- # Список: в одну строку [Юпитер, Сатурн, Уран, Нептун]
Словари представлены в виде пар ключей и значений. Значение отделяется от ключа двоеточием и пробелом. Пробел здесь обязателен. В формате JSON словари заключаются в фигурные скобки.
--- # Словарь: блочный формат Газовые гиганты: ледяные: - Уран - Нептун не ледяные: - Юпитер - Сатурн # Словарь: в одну строку Газовые гиганты: {ледяные: [Уран, Нептун], не ледяные: [Юпитер, Сатурн]}
Несколько документов в одном файле
Документы в одном файле разделяются тремя дефисами.
--- планета: название: Земля спутники: [Луна] --- планета: название: Марс спутники: [Фобос, Деймос]
Чтобы обозначить конец файла без начала нового, используются три точки.
Строки
Строки в YAML не обязательно заключать в кавычки. Строки без кавычек могут содержать кавычки.
Одинарные кавычки используются, когда не требуется экранировать символы. Если в такую строку нужно вставить одинарную кавычку, она экранируется также одинарной кавычкой.
Строки в двойных кавычках могут содержать экранированные символы в стиле языка C.
Это показано в приведенном ниже примере.
no_quotes: This string is not in quotes but it can contain ' and ". single_quotes: 'This is a string in single quotes. It contains both single ('') and double (") quotes.' double_quotes: "This is a string in double quotes.\nIt contains both single (') and double (\") quotes\nand a new line characters."
Их внутреннее представление будет таким:
Строки могут записываться и в блочном формате. Если литерал обозначается вертикальной чертой, то пробелы в нем сохраняются. В спецификации YAML 1.2.2 приводится такой пример:
--- | \//||\/|| // || ||__
Ведущие пробелы удаляются, а внутренние — сохраняются:
>
», то строки складываются в одну, ведущие пробелы удаляются, а внутренние также сохраняются:
--- > This line spans multiple lines but will be folded.
Но отступы и дополнительные новые строки сохраняются:
--- > This line spans multiple lines but will be folded partly.
Теги
Чтобы явно указать тип значения, используются теги, обозначаемые двумя восклицательными знаками:
--- not-date: !!str 2022-01-12
В этом примере значение будет не датой, а строкой.
Многие реализации YAML поддерживают пользовательские типы для сериализации. Это локальные типы. Они обозначаются одним восклицательным знаком и определяются в приложении с помощью библиотеки для парсинга YAML.
--- myCat: !Cat { name: Tom, color: red }
Ссылки
Ссылка обозначается амперсандом (&
), а ее значение подставляется с использованием звездочки (*
).
--- references: val1: &ref This will be repeated val2: *ref
Ссылки можно использовать, например, чтобы избежать дублирования блоков конфигурации.
Другие возможности
У YAML есть еще много возможностей, в том числе наследование, ключи из сложных типов данных, расширенные последовательности, дополнительные типы данных. О них вы можете узнать из текущей спецификации и других источников.
YAML — это понятный, компактный и удобный язык. Его можно использовать в файлах конфигурации для обмена информацией между процессами, хранения объектов и в других целях. Благодаря тому, что YAML является надмножеством JSON, опытному программисту его легко понять и освоить (по аналогии с JSON).
В заключение приводим несколько полезных ссылок для более тесного знакомства с YAML.
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…