JSON против YAML: Какой формат конфигурации выбрать?
Быстрый ответ
Используйте JSON для API, обмена данными и случаев, где важны строгие parsing&validation. Используйте YAML для конфигурационных файлов, DevOps-манифестов и где важна читаемость и комментарии. YAML — superset JSON —каждый валидный JSON валидный YAML.
Введение
JSON и YAML — оба человеко-читаемые форматы сериализации данных. JSON строгий, минимальный и вездесущий в web API. YAML — superset JSON, добавляющий комментарии, multiline strings, anchors и структуру на основе отступов —что делает его популярным для конфигурационных файлов (Docker Compose, Kubernetes, CI/CD).
Шаг за шагом
-
Сравните синтаксис и читаемость
JSON использует фигурные скобки и кавычки: {"key": "value"}. В YAML используются отступы и двоеточия: ключ: значение. YAML более удобен в настройке — для строк не нужны кавычки, нет запятых между элементами и фигурных скобок. JSON более явный и менее подвержен ошибкам при обмене данными.
-
Сравнить возможности
YAML поддерживает: комментарии (#), многострочные строки (|, >), привязки (&) и псевдонимы (*), несколько документов в одном файле (---) и сложные типы. JSON не поддерживает ничего из этого — ни комментариев, ни многострочных строк, ни ссылок. Простота JSON намеренна: это формат обмена данными, а не язык конфигурации.
-
Сравните безопасность и синтаксический анализ
Анализ JSON выполняется быстро и безопасно — JSON.parse встроен в каждый движок JavaScript. Анализ YAML медленнее и сложнее — спецификация YAML составляет более 80 страниц по сравнению с 2 страницами JSON. У YAML есть риски безопасности (атака на миллиард смеха через привязки), которых нет у JSON. Всегда используйте безопасный анализатор YAML, который отключает привязки.
-
Сравните использование экосистемы
JSON: REST APIs, package.json, tsconfig.json, базы данных NoSQL, веб-приложения. YAML: Docker Compose, манифесты Kubernetes, действия GitHub, сборники сценариев Ansible, конфигурации CI/CD, спецификации OpenAPI. JSON доминирует над данными времени выполнения; YAML доминирует в конфигурации.
-
Решите, исходя из вашего варианта использования
APIs, обмен данными, NoSQL, состояние веб-приложения: JSON. Файлы конфигурации, DevOps, CI/CD, инфраструктура как код: YAML. Если люди пишут это вручную: YAML. Если машины генерируют и потребляют его: JSON.
Примеры
Та же конфигурация в JSON и YAML.
Вход: JSON: {"server": {"port": 8080, "host": "localhost"}}
YAML: server:\n port: 8080\n host: localhost
Выход: YAML на 30 % короче и поддерживает комментарии. JSON более строгий и универсальный.
Распространенные проблемы
- Ошибки отступов YAML: YAML использует отступы для структуры, а один неправильный пробел нарушает синтаксический анализ — используйте редактор с анализом YAML и всегда используйте пробелы, а не табуляцию.
- Атака «миллиарда смеха» YAML: якоря и псевдонимы YAML могут создавать экспоненциальное расширение, вызывая DoS — используйте безопасный синтаксический анализатор YAML, который отключает якоря (например, yaml.safe_load в Python).
- JSON не имеет комментариев: спецификация JSON запрещает комментарии, что затрудняет аннотирование файлов конфигурации — используйте YAML для конфигурации, редактируемой человеком, JSON для данных, сгенерированных машиной.
- Сюрпризы неявной типизации YAML: YAML автоматически преобразует да/нет в логические значения и 1.0 в число с плавающей запятой, что может привести к нарушению строковых полей — явно заключайте строки в кавычки, чтобы избежать неожиданного приведения типов.
Советы
- Используйте YAML для конфигурации, созданной человеком (Docker Compose, Kubernetes, CI/CD) и JSON для обмена машинными данными (APIs, NoSQL, состояние приложения).
- Всегда используйте безопасный анализатор YAML, который отключает привязки и псевдонимы — никогда не используйте универсальный загрузчик YAML для ненадежных входных данных.
- При преобразовании YAML в JSON будьте готовы потерять комментарии, многострочные строки и привязки — JSON — это подмножество YAML, а не наоборот для функций.
- Последовательный отступ в YAML с двумя пробелами — смешивание табуляции и пробелов или использование непоследовательных отступов — наиболее распространенная ошибка синтаксического анализа YAML.