Конвертер YAML в JSON и обратно

Преобразовать YAML в JSON и JSON в YAML: настройка отступов, проверка синтаксиса с номером строки ошибки, многострочные значения и якоря. Обработка идёт в браузере, файл никуда не отправляется.

Настройки

YAML в JSON — разобрать и записать JSON; JSON в YAML — записать те же данные в YAML

Сколько пробелов на каждый уровень вложенности. Табуляция — один символ \t

Исходный YAML

Результат пересчитывается по мере ввода

Результат

Пока нечего показывать: вставьте текст в поле выше

Зачем конвертировать YAML и JSON

YAML и JSON описывают одни и те же данные, но живут в разных местах. YAML пишут руками: ключи обходятся без кавычек, структуру задают отступы, есть комментарии, ссылки на повторяющиеся блоки и многострочный текст — поэтому на нём написаны конфиги, которые правят люди. JSON читают программы: правил в нём немного, и он есть в каждом языке, поэтому именно им обмениваются по сети. Конвертер нужен там, где эти два мира встречаются: манифест Kubernetes надо отдать скрипту, который понимает только JSON, а сгенерированные данные — записать в файл, который будет править человек.

Инструмент переводит данные в обе стороны и разбирает их настоящими парсерами: YAML — пакетом yaml, JSON — встроенным в браузер разборщиком. Это важно для ошибок: сообщение приходит от того же разбора, который работает в вашей программе, и рядом оказываются номер строки, позиция и сама проблемная строка с пометкой. Свой разбор «на регулярках» расходился бы с настоящим ровно на том, что сложнее всего, — на блочных скалярах, тегах, ссылках и отступах.

Отдельная забота — то, чего в JSON нет. Ссылки на якоря разворачиваются в полные значения, ключ слияния «<<» применяется, теги «!!binary» и «!!timestamp» превращаются в строки, а ссылка значения на самого себя в JSON невыразима, и об этом сообщается отдельно. Всё считается в браузере: текст конфига никуда не отправляется, что существенно, когда внутри пароли, токены и адреса внутренних сервисов.

Частые вопросы

Чем YAML отличается от JSON и зачем конвертировать?

Это две записи одних и тех же данных, и различаются они не смыслом, а удобством. JSON расставляет кавычки вокруг каждого ключа и строки, ставит фигурные скобки, запятые и двоеточия — за это его одинаково читают все языки, и именно им обмениваются по сети. YAML обходится отступами, разрешает комментарии, ссылки на повторяющиеся блоки и многострочный текст — его удобно править руками, и на нём написаны манифесты Kubernetes, docker-compose.yml и пайплайны GitLab CI. Конвертируют в обе стороны: из YAML в JSON, чтобы отдать конфиг программе, которая понимает только JSON, и из JSON в YAML, чтобы записать сгенерированные данные в удобный для правки вид. Переносится при этом не всё: комментарии исчезают, ссылки разворачиваются в значения.

Что делать с ошибкой синтаксиса и как читать номер строки?

Инструмент показывает сообщение разборщика, номер строки, позицию в ней и саму строку с пометкой «^» под проблемным символом. Строка и позиция считаются с единицы: «строка 12, позиция 5» — это двенадцатая строка и пятый символ в ней. Главное, что стоит помнить: разбор останавливается не на ошибке, а на символе, который прочитал после неё. Незакрытая кавычка обнаруживается там, где строка должна была закончиться, поэтому сообщение «Missing closing quote» в конце файла почти всегда означает кавычку, открытую выше. Самые частые причины: неверный уровень отступа, табуляция в отступе, пропущенное двоеточие после ключа, лишний отступ у продолжения значения, незакрытая кавычка или скобка.

Как записываются многострочные строки?

В YAML их три способа. Блочный скаляр начинается со знака «|»: текст ниже пишется как есть, переносы сохраняются, а «|-» дополнительно отсекает последний перенос. Свёрнутый «>» превращает переносы в пробелы — так записывают абзац текста. Двойные кавычки с «\n» дают ту же строку, но в одну строку файла. В JSON многострочных значений не бывает вовсе: там всегда одна строка с «\n» внутри. Поэтому настройка «Многострочные строки» видна только при переводе из JSON в YAML: «Оставлять как есть» сохраняет escape-последовательность, «Блочным скаляром» записывает значение через «|». Знак выбирается по последнему символу строки — если она заканчивается переносом, ставится «|» и перенос сохраняется, иначе «|-» и лишний перенос при чтении не появится.

Поддерживаются ли якоря, ссылки и теги?

Да, но при переводе в JSON они разворачиваются. Якорь «&имя» и ссылка «*имя» — способ записать повторяющийся блок один раз; в JSON ссылок нет, поэтому значение подставляется целиком в каждое место, где стояла ссылка, и файл от этого растёт. Ключ слияния «<<: *базовый» применяется: унаследованные ключи попадают в объект явными значениями, и в получившемся JSON видно, что вышло в итоге. Ссылка, указывающая на саму себя («a: &x {self: *x}»), в JSON невыразима — бесконечную структуру туда не записать, и инструмент сообщает об этом вместо того, чтобы зациклиться. Теги тоже разбираются: «!!binary» превращается в строку base64, «!!timestamp» — в строку с датой, «!!str 123» — в строку «123», «!!set» и «!!omap» — в массив и объект. Незнакомый тег вроде «!foo» разбору не мешает: значение остаётся таким, каким записано.

Почему YAML после конвертации в JSON стал больше?

Потому что запись JSON многословнее. Каждый ключ и каждая строка берутся в кавычки, появляются фигурные скобки и запятые, а отступ в два или четыре пробела повторяется на каждом уровне вложенности. Свою долю добавляют ссылки: они разворачиваются в полные копии значений, и один блок, записанный в YAML один раз, в JSON оказывается столько раз, сколько на него ссылались. Размеры до и после инструмент показывает в байтах UTF-8 — ровно теми, какими файл ляжет на диск: кириллица в подсчёте символов «весит» вдвое меньше, чем занимает в файле. Обратный перевод обычно уменьшает объём, но не всегда: короткий JSON с одной строкой на значение и YAML с отступами могут оказаться почти одного размера.

Где применяют YAML?

В конфигурации и описаниях инфраструктуры: манифесты Kubernetes, docker-compose.yml, пайплайны GitLab CI и GitHub Actions, плейбуки Ansible, values.yaml для Helm, описания OpenAPI, конфиги линтеров и генераторов сайтов. Почти у каждой такой системы есть второй вход, принимающий те же данные в JSON, — Kubernetes API, клиентские библиотеки, скрипты сборки, — и конвертация нужна в обе стороны. Из YAML в JSON переводят, чтобы отдать конфиг программе, сравнить два файла после нормализации или проверить его строгим разборщиком; из JSON в YAML — чтобы записать сгенерированные данные так, чтобы их было удобно читать и править руками.

Файл отправляется на сервер?

Нет. Разбор, разворачивание ссылок и запись результата выполняются в браузере на JavaScript: содержимое поля никуда не передаётся, не сохраняется и не попадает в логи. Это важно именно для конфигов, потому что в них почти всегда есть то, что не должно уходить наружу, — пароли баз, токены доступа, адреса внутренних сервисов, ключи от внешних API. Инструментом можно пользоваться офлайн: после загрузки страницы соединение с сетью ему не нужно, а результат сохраняется кнопкой «Скачать» прямо на устройство.