Что такое преобразование JSON ↔ YAML?
JSON (JavaScript Object Notation, RFC 8259) — строгий текстовый формат с фигурными скобками для структурированных данных; YAML (YAML Ain't Markup Language, версия 1.2) — надмножество JSON, использующее отступы, переводы строк и человекочитаемый синтаксис для той же модели значений. Преобразование между ними позволяет переключать одну и ту же конфигурацию между удобной для машин формой (JSON для API, проверки схемы, программных преобразований) и удобной для человека (YAML для код-ревью, манифестов Kubernetes, workflow-файлов GitHub Actions) без переписывания ни одного ключа.
Как работает преобразование JSON ↔ YAML?
Каждое преобразование выполняется локально в вашем браузере с использованием встроенной библиотеки js-yaml (MIT, версия 4.1.0). Основные шаги:
- Переключатель режима (Авто-определение / JSON → YAML / YAML → JSON) выбирает, какой конвейер запустится. В режиме Авто-определение первый непробельный символ ввода определяет направление —
{или[означает JSON; всё остальное означает YAML. - JSON → YAML:
JSON.parseпроверяет ввод и формирует JavaScript-значение;jsyaml.dump(value, { indent, lineWidth: -1, sortKeys: false })выводит форму YAML 1.2. При включённом Многодокументном режиме входной массив выгружается по одному элементу на документ и склеивается разделителями---. - YAML → JSON:
jsyaml.loadAllразбирает каждый документ во входе (автоматически обрабатывая разделители---) в массив; однодокументный ввод разворачивается, чтобы JSON-вывод был самим документом, а не массивом из одного элемента. - Отступ (2 или 4 пробела) и Форматирование настраиваются. С выключенным Форматированием выводится минифицированный JSON через
JSON.stringify(value)без пробелов. - Вывод записывается в текстовое поле только для чтения. При ошибках разбора YAML сообщение об ошибке содержит 1-индексированные строку и колонку, сообщаемые в
e.markбиблиотекойjs-yaml, так что вы можете сразу перейти к месту ошибки.
Зачем преобразовывать JSON и YAML этим инструментом?
- Конфиденциальность: каждый этап разбора, преобразования и вывода происходит в вашем браузере. Данные — включая секреты Kubernetes, подписанные JWT и собственные конфиги — никогда не попадают на наши серверы.
- Многодокументный YAML:
jsyaml.loadAllраспознаёт разделители---и возвращает массив документов, который конвертер разворачивает в одиночном случае или сохраняет как JSON-массив для многодокументных случаев. - Якоря и алиасы разрешены: механизм
&anchor/*aliasв YAML обрабатывается схемой по умолчаниюjs-yaml. Значение, определённое один раз и упомянутое дважды, круговым обменом превращается в JSON-объект, где обе ссылки имеют равные значения. - Без CDN, без телеметрии: библиотека
js-yaml.min.jsпоставляется с того же источника, что и страница, поэтому инструмент работает офлайн, за корпоративными прокси и в изолированных средах.
Каковы распространённые применения преобразования JSON ↔ YAML?
Переход между JSON и YAML встречается в DevOps, платформенной инженерии и инструментах для API:
- Манифесты Kubernetes: преобразование YAML
Deployment,ConfigMapилиHelmReleaseв JSON, чтобы внутренний валидатор политик (Joi, Ajv, OPA Rego) мог проверить его программно, а затем обратно в YAML для применения в кластере. - CI/CD-конвейеры: круговой обмен
workflow.ymlGitHub Actions через JSON, чтобы генератор кода переписал матрицу или зависимости задач, после чего выпускается аккуратный YAML для PR. - OpenAPI-спецификации: вставка JSON
openapi.jsonиз автогенерируемой документации бэкенда и преобразование вopenapi.yamlдля редактируемого человеком справочника в репозитории.
Как выглядит пример кругового обмена JSON ↔ YAML?
Если вставить {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"web"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"web"}}}} и нажать ПРЕОБРАЗОВАТЬ в режиме JSON → YAML, получится восемь строк YAML с отступами, причём apiVersion: apps/v1 на первой строке. Подача этого YAML обратно в режиме YAML → JSON с включённым Форматированием возвращает исходный объект байт-в-байт после стабильного JSON.stringify(value, null, 2), причём порядок ключей сохраняется, так как схема по умолчанию js-yaml соблюдает порядок вставки в обоих направлениях.
Работает ли этот конвертер JSON ↔ YAML полностью в моём браузере?
Да. Каждый этап разбора, преобразования и вывода выполняется локально как JavaScript внутри вкладки браузера. Встроенная библиотека js-yaml поставляется с того же источника, что и страница, — без CDN, без fetch, без XMLHttpRequest, без navigator.sendBeacon на входе. Инструмент также работает офлайн после загрузки страницы, поскольку это статический бандл HTML/CSS/JS с библиотекой производителя рядом. Секреты Kubernetes, полезные нагрузки JWT, подписанные YAML CloudFormation и собственные конфиги остаются на вашем устройстве.
Как конвертер обрабатывает многодокументный YAML?
YAML поддерживает несколько документов в одном потоке, разделённых строками, содержащими только ---. На YAML → JSON конвертер вызывает jsyaml.loadAll, который возвращает каждый документ как JavaScript-значение. Если найден ровно один документ, JSON-вывод — это сам документ; если найдено два или более, JSON-вывод — массив. На JSON → YAML, когда вход — JSON-массив И включён переключатель Многодокументный, каждый элемент массива выводится как отдельный документ с разделителями --- между ними — удобно для генерации пакета, готового для kubectl apply, из JSON-массива ресурсов.
Поддерживаются ли якоря и алиасы YAML?
Да — определения &anchor и ссылки *alias разрешаются схемой по умолчанию js-yaml на этапе загрузки. Ввод YAML вида defaults: &d\n retries: 3\n timeout: 30\njob_a:\n <<: *d\njob_b:\n <<: *d разбирается в JSON-объект, где job_a и job_b оба содержат retries: 3, timeout: 30. Ключ слияния << (расширение YAML 1.1, которое js-yaml всё ещё поддерживает) также поддерживается в схеме по умолчанию.
Сохраняются ли комментарии YAML при преобразовании в JSON и обратно?
Нет — js-yaml удаляет комментарии на этапе разбора, поэтому круговой обмен YAML → JSON → YAML потеряет каждую строку с префиксом #. Это известное ограничение модели load/dump; если сохранение комментариев критично, используйте библиотеку, осознающую комментарии, например пакет yaml на npm (он предоставляет API CST + AST, спроектированный для сохранения тривии), вместо js-yaml. Для большинства задач по преобразованию конфигов компромисс приемлем: YAML после кругового обмена сохраняет каждый ключ, значение, якорь и алиас, лишь без авторских комментариев.
Что происходит с пользовательскими тегами YAML?
Конвертер использует DEFAULT_SCHEMA в js-yaml, которая понимает !!str, !!int, !!float, !!bool, !!null, !!seq, !!map, !!binary и !!timestamp — каждый тег из core- и JSON-схем YAML 1.2. Пользовательские или прикладные теги (например, !Ref в CloudFormation, !vault в Ansible) не распознаются и приводят к понятной ошибке с указанием неподдерживаемого тега. Для CloudFormation в частности используйте поток aws cloudformation package + --output-template-file, чтобы раскрыть пользовательские теги перед вставкой в этот конвертер.
Этот конвертер JSON ↔ YAML поставляется с js-yaml@4.1.0 в одном источнике, поддерживает многодокументные потоки и якоря/алиасы из коробки и сообщает об ошибках разбора YAML со строкой и колонкой, чтобы вы могли исправить источник. Без загрузок, без CDN, без телеметрии — каждый байт остаётся в вашем браузере.