YAML
1 tools
Форматы сериализации данных
Сериализация данных — это процесс преобразования структурированных данных в формат, который может быть сохранён или передан, а затем восстановлен.
JSON, YAML, TOML и XML — четыре доминирующих текстовых формата сериализации в разработке программного обеспечения.
JSON и YAML рядом
JSON и YAML представляют одну и ту же модель данных. YAML является строгим надмножеством JSON — любой корректный JSON-документ является также корректным YAML.
{
"server": {
"host": "localhost",
"port": 8080,
"debug": true
},
"database": {
"url": "postgres://localhost/mydb",
"pool": 10
}
}server: host: localhost port: 8080 debug: true database: url: postgres://localhost/mydb pool: 10
YAML использует отступы вместо скобок и опускает кавычки для большинства строковых значений, что делает его более компактным и читаемым.
Сравнение форматов
| Формат | Читаемость | Комментарии | Массивы | Лучше всего для |
|---|---|---|---|---|
| JSON | ★★★☆☆ | Нет комментариев | Нативные | API, обмен данными |
| YAML | ★★★★★ | Да (#) | Нативные | Конфиг-файлы, IaC |
| TOML | ★★★★☆ | Да (#) | Нативные | Конфиг приложений (Rust, Python) |
| XML | ★★☆☆☆ | Да (<!-- -->) | Повторяющиеся элементы | Документы, SOAP, SVG |
Подводные камни YAML
YAML мощный, но имеет известные граничные случаи, которые удивляют разработчиков:
Значение 'NO' в YAML 1.1 интерпретируется как булев false. Коды стран NO (Норвегия), OFF, FALSE, N разбираются как false. Всегда заключайте неоднозначные строки в кавычки.
YAML использует отступы для определения структуры. Лишний пробел или символ табуляции может полностью изменить смысл документа. Табуляция в YAML запрещена — только пробелы.
Значения, похожие на числа, булевы или null, автоматически преобразуются. Используйте кавычки для значений, которые должны оставаться строками.
Спецификация YAML явно запрещает символы табуляции для отступов. Настройте редактор на использование пробелов в YAML-файлах.
YAML имеет два индикатора для многострочных строк: | (литеральный блок, сохраняет переносы строк) и > (свёрнутый блок, преобразует переносы в пробелы).
Якоря (&) и псевдонимы (*) YAML позволяют повторно использовать узлы, но могут создавать циклические ссылки.
Уникальные возможности YAML
Комментарии
YAML поддерживает комментарии с символом #. Это одно из главных практических преимуществ перед JSON для конфигурационных файлов.
Якоря и псевдонимы
YAML позволяет определить узел один раз с &имя-якоря и повторно использовать его везде с *имя-якоря.
Многострочные строки
YAML поддерживает блочные скаляры с двумя режимами: литеральный блок (|) сохраняет переносы строк; свёрнутый блок (>) преобразует их в пробелы.
Когда нужна конвертация
GitHub Actions, GitLab CI и CircleCI нативно используют YAML. При программной генерации конфигураций часто проще создать JSON-объект и конвертировать его в YAML.
Ресурсы Kubernetes определяются в YAML, но некоторые инструменты выдают JSON. Конвертация между форматами позволяет инспектировать ответы API.
REST API возвращают JSON. При передаче этих данных в YAML-based системы конфигурации конвертер устраняет разрыв.
Переход с одного инструмента на другой часто означает конвертацию формата конфигурации.
Инструменты JSON Schema более зрелые. Распространённый паттерн — писать конфигурацию в YAML для читаемости, конвертировать в JSON для валидации.
Внутренние инструменты могут использовать YAML-конфигурации, а внешние API требуют JSON.
Часто задаваемые вопросы
Да. YAML 1.2 является строгим надмножеством JSON — любой корректный JSON-документ является корректным YAML.
YAML поддерживает комментарии, которых нет в JSON. YAML также более компактен для глубоко вложенных структур.
TOML разработан для конфигурационных файлов с чётким синтаксисом в стиле INI. Стандарт для Rust (Cargo.toml) и Python (pyproject.toml).
Редко. JSON сохраняет порядок ключей в большинстве парсеров. YAML поддерживает якоря и теги без аналогов в JSON.
JSON.stringify конвертирует значения undefined в null в массивах и опускает их из объектов.
Да. Поскольку YAML является надмножеством JSON, синтаксис JSON можно встраивать прямо в YAML-документ.