Статья-путеводитель · 6 минута чтения
YAML против JSON: когда какой использовать
YAML и JSON — это выбор между двумя форматами сериализации, основанными на одной и той же базовой идее: вложенных парах ключ-значение и списках. На практике важные различия заключаются в том, кто читает файл: люди или машины.
Обновлено
YAML против JSON: короткая версия
JSON — это формат обмена данными: строгий, однозначный, и каждый язык может его анализировать. YAML — это формат конфигурации: он принимает комментарии и многострочные строки и предназначен для редактирования людьми в запросах на включение. Используйте JSON в проводной сети, YAML в файлах, которые поддерживаются людьми, и конвертируйте между ними, когда этого требует граница.
Чем на самом деле отличается
Комментарии
YAML имеет комментарии; JSON нет. В файлах конфигурации это имеет решающее значение — причина, по которой вы знаете, почему тайм-аут установлен на 3000, обычно является комментарием над ним. При преобразовании YAML в JSON комментарии удаляются, поэтому JSON часто рассматривается как артефакт сборки, а не источник истины.
Синтаксис и шум
# YAML
service:
name: checkout
replicas: 3
ports: [8080, 9090]
// JSON — same data
{
"service": {
"name": "checkout",
"replicas": 3,
"ports": [8080, 9090]
}
}
YAML удаляет фигурные скобки, кавычки и запятые в обмен на чувствительность к отступам. Это правило, известное каждому пользователю YAML: меньше символов, больше способов сделать пробелы слегка неправильными.
Виды и ловушки
- JSON имеет один числовой тип; YAML различает целые числа, числа с плавающей запятой и многое другое, а YAML 1.1 классно анализирует код страны NO как логическое значение false, а 1.10 – как число, которое теряет конечный ноль, если не указано в кавычках.
- YAML поддерживает привязки и псевдонимы (&defaults / *defaults) для повторного использования; JSON не имеет эквивалента, поэтому общие блоки необходимо дублировать или генерировать.
- YAML поддерживает файлы с несколькими документами (--- разделители); JSON — один документ в файле. Конвертеры обычно преобразуют документы в массив.
- JSON требует ключей и строк в двойных кавычках; YAML заключает в кавычки только при необходимости, а это означает, что неосторожная строка может незаметно стать числом или логическим значением.
Где выигрывает каждый формат
- API и форматы проводов: JSON. Универсальные парсеры, предсказуемая неоднозначность, поддержка потоковой передачи (JSON Строки).
- Kubernetes, CI/CD, Docker Compose, Ansible, Helm: YAML, потому что эти экосистемы стандартизированы на нем и поддерживают комментарии.
- Конфигурацию поставщика вы генерируете программно: JSON — алгоритмы создают ее без беспокойства об отступах.
- Документы, которые младший товарищ по команде будет редактировать вручную: YAML, с комментариями, объясняющими почему.
Безопасное преобразование
- Знайте свои многодокументные файлы. Набор манифестов k8s, разделенный ---, должен стать массивом JSON, а не просто первым документом. Используйте конвертер, который сообщает, сколько документов он нашел.
- Укажите числа, которые являются идентификаторами. «1.10» — версия; 1,10 — это плавающее число. Включите принудительные кавычки при преобразовании в YAML, если значения представляют собой строки, которые выглядят числовыми.
- Наблюдайте за исчезновением комментариев. Преобразование в JSON по определению происходит с потерями; если комментарии имеют значение, оставьте YAML в качестве источника и генерируйте JSON только во время сборки.
- Подтвердить с точными ошибками. Ошибки отступов в некоторых инструментах приводят к вводящим в заблуждение сообщениям; убедитесь, что у вас отображаются строка и столбец.
Попробуйте: вставьте любой YAML в конвертер YAML в JSON — встроена поддержка нескольких документов и точные строки ошибок, и ничего не загружается.
Общие вопросы
Является ли YAML надмножеством JSON?
YAML 1.2 разработан как надмножество — действительный JSON обычно действителен YAML. Но YAML 1.1 (все еще существует) в некоторых крайних случаях отличается, а вкладки, повторяющиеся клавиши и некоторые строки анализируются по-разному в разных движках. Относитесь к фразе «технически допустимо YAML» как к забавному факту, а не как к стратегии миграции.
Что быстрее разбирать?
Парсеры JSON обычно работают быстрее и проще, поскольку грамматика меньше; Собственный синтаксический анализ JSON существует в каждой среде выполнения. Для конфигурационных файлов разница не имеет значения — вы анализируете их один раз при запуске.