YAML

1 tools

Форматы сериализации данных

Сериализация данных — это процесс преобразования структурированных данных в формат, который может быть сохранён или передан, а затем восстановлен.

JSON, YAML, TOML и XML — четыре доминирующих текстовых формата сериализации в разработке программного обеспечения.

JSON и YAML рядом

JSON и YAML представляют одну и ту же модель данных. YAML является строгим надмножеством JSON — любой корректный JSON-документ является также корректным YAML.

JSON
{
  "server": {
    "host": "localhost",
    "port": 8080,
    "debug": true
  },
  "database": {
    "url": "postgres://localhost/mydb",
    "pool": 10
  }
}
YAML
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 поддерживает блочные скаляры с двумя режимами: литеральный блок (|) сохраняет переносы строк; свёрнутый блок (>) преобразует их в пробелы.

Когда нужна конвертация

Конфигурация CI/CD-пайплайнов

GitHub Actions, GitLab CI и CircleCI нативно используют YAML. При программной генерации конфигураций часто проще создать JSON-объект и конвертировать его в YAML.

Манифесты Kubernetes

Ресурсы Kubernetes определяются в YAML, но некоторые инструменты выдают JSON. Конвертация между форматами позволяет инспектировать ответы API.

Обработка ответов API

REST API возвращают JSON. При передаче этих данных в YAML-based системы конфигурации конвертер устраняет разрыв.

Миграция конфигурации

Переход с одного инструмента на другой часто означает конвертацию формата конфигурации.

Рабочий процесс валидации схемы

Инструменты JSON Schema более зрелые. Распространённый паттерн — писать конфигурацию в YAML для читаемости, конвертировать в JSON для валидации.

Обмен данными с API

Внутренние инструменты могут использовать YAML-конфигурации, а внешние API требуют JSON.

Часто задаваемые вопросы

Является ли YAML надмножеством JSON?

Да. YAML 1.2 является строгим надмножеством JSON — любой корректный JSON-документ является корректным YAML.

Почему выбирать YAML вместо JSON для конфигурационных файлов?

YAML поддерживает комментарии, которых нет в JSON. YAML также более компактен для глубоко вложенных структур.

Что такое TOML и когда его использовать?

TOML разработан для конфигурационных файлов с чётким синтаксисом в стиле INI. Стандарт для Rust (Cargo.toml) и Python (pyproject.toml).

Теряется ли информация при конвертации JSON в YAML?

Редко. JSON сохраняет порядок ключей в большинстве парсеров. YAML поддерживает якоря и теги без аналогов в JSON.

Что вызывает появление 'undefined' в JSON-выводе?

JSON.stringify конвертирует значения undefined в null в массивах и опускает их из объектов.

Можно ли использовать JSON в YAML-файле?

Да. Поскольку YAML является надмножеством JSON, синтаксис JSON можно встраивать прямо в YAML-документ.