belun.app Блог
EN

JSON и YAML: когда конвертировать и что может пойти не так

Где выигрывает JSON, а где YAML, как «проблема Норвегии» портит данные в конфигах и что проверить, прежде чем файл пройдёт путь туда и обратно.

Код на экране ноутбука — конвертация JSON-конфигурации в формат YAML

JSON и YAML описывают одно и то же: объекты, массивы, строки, числа, булевы значения, null. У любого корректного JSON-документа есть YAML-эквивалент, и почти любой YAML разворачивается обратно в JSON. Зачем тогда вообще конвертировать? Затем, что машины предпочитают один формат, а люди — другой. Конвертер JSON в YAML работает ровно на этой границе.

Где какой формат выигрывает

JSON — язык API. Он строгий, быстро парсится, и строку в нём можно записать ровно одним способом. Из-за той же строгости его никто не любит править руками: каждая скобка должна закрыться, каждый ключ — стоять в кавычках, а одна лишняя запятая ломает весь файл.

YAML убрал скобки и лишние кавычки, а ещё разрешил комментарии. Последнее важнее, чем кажется. Продакшен-конфиг без единого комментария вида # не опускать ниже 3 — это конфиг, который кто-нибудь сломает через полгода. Манифесты Kubernetes, файлы Docker Compose, workflow GitHub Actions, плейбуки Ansible — всё это YAML, и всё это рассчитано на чтение человеком во время код-ревью.

Типичный сценарий: API отдал JSON, а вам нужно вставить его в values-файл Helm. Или наоборот — есть docker-compose.yml, а скрипт понимает только JSON. Вставили, конвертировали, готово.

Проблема Норвегии

За удобство YAML приходится платить: значения без кавычек интерпретируются. Классический пример — список кодов стран:

countries:
  - DE
  - FR
  - NO

По правилам YAML 1.1 NO разбирается как булево false. Норвегия исчезает из данных, и никто вас не предупредит. В ту же ловушку попадают yes, on, off и номера версий: version: 1.20 молча превращается в число 1.2. Пользователи Kubernetes натыкались на это так часто, что в документации появился отдельный раздел. А почтовые индексы с ведущим нулём старые парсеры читают как восьмеричные числа.

YAML 1.2 почти всё это исправил (булевыми остались только true и false), но многие парсеры до сих пор по умолчанию ведут себя как 1.1. Надёжная привычка: брать в кавычки всё, что лишь похоже на строку. Наш конвертер делает это сам — при переводе JSON в YAML значения вроде "NO", "42" или "1.20" выходят в кавычках и переживают обратное чтение.

Что не переживает путь туда и обратно

Конвертация YAML в JSON теряет часть файла — так устроен формат:

  • Комментарии пропадают. В JSON для них просто нет синтаксиса.
  • Якоря и ссылки разворачиваются или отклоняются: JSON не умеет выражать «это значение — ссылка на то».
  • Порядок ключей и стиль записи (кавычки, блочный или потоковый вид) нормализуются.

Сами данные в безопасности. Но если ваш YAML держится на комментариях, храните оригинал, а не считайте JSON-версию новым источником истины.

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

Валидация — незаметная, но главная функция

Половина пользы конвертера в том, что он отказывается принимать битые данные. Вставили манифест Kubernetes и получили ошибку в строке 14? Вы нашли проблему раньше, чем её нашёл kubectl. Конвертер JSON в YAML проверяет оба направления по мере ввода, и всё происходит в браузере. В конфигах часто лежат внутренние хосты и секреты — им незачем ехать на чужой сервер ради переформатирования.

Вставьте свой JSON или YAML в конвертер — и получите второй формат мгновенно: бесплатно, без регистрации, без загрузки на сервер.

Попробуйте инструмент

Конвертер JSON в YAML →