YAML инструменты · 6 минута чтения
От YAML до JSON: конвертируем конфиги, не теряя рассудка
Преобразование YAML в JSON занимает две секунды, пока оно не исчезнет: случайная вкладка, дубликат ключа или второй документ, скрытый за маркером `---`, превращают чистое преобразование в тихую ошибку потери данных. В этом руководстве рассказывается о том, что должно дать вам хорошее преобразование YAML в JSON, а также о конкретных режимах сбоя, которые стоит проверить, прежде чем выходные данные будут отправлены куда-либо.
Обновлено
Что на самом деле делает преобразование YAML в JSON
YAML и JSON описывают одни и те же фигуры — карты, списки, строки, числа, логические значения и ноль — поэтому преобразование в основном сводится к повторной сериализации одного синтаксиса в другой. Что меняется, так это поверхность: отступы становятся фигурными скобками, комментарии исчезают, привязки становятся копиями, а многострочные строки сворачиваются в escape-символы `\n`. Каждое из этих преобразований в некотором смысле имеет потери, поэтому шаг преобразования стоит делать сознательно, а не рассматривать его как второстепенную мысль о форматировании.
Практическая причина преобразования заключается в том, что JSON — это то, что нужно следующему инструменту. Kubernetes принимает YAML, но `kubectl`, конвейеры jq, вызовы API и JavaScript более комфортно говорят на JSON. Однократное правильное преобразование лучше, чем параллельное редактирование двух форматов вручную.
Несколько документов YAML: проблема молчаливого первого документа
Файл YAML может содержать несколько документов, разделенных `---`. Большинство преобразователей спокойно возвращают первый и выбрасывают остальные — поэтому пакет манифеста с развертыванием, службой и ConfigMap становится одним объектом без предупреждения. Правильное преобразование либо выдает массив документов, либо явно спрашивает, какой из них вам нужен. Если преобразователь не обеспечивает такого контроля, он теряет данные.
Ошибки должны указывать на строку и столбец.
Толерантность YAML к пробелам – именно поэтому небольшие ошибки трудно найти. Табуляция недопустима для отступов, отсутствие двоеточия превращает сопоставление в строку, а повторяющиеся ключи принимаются одними анализаторами и отклоняются другими. Если преобразование завершается неудачей, единственное полезное сообщение называет строку и столбец и показывает оскорбительный отрывок:
spec:
containers:
- name: web # tab used for indentation
error: line 3, column 0 — tabs cannot be used for indentation
Дубликаты ключей представляют собой опасный случай: анализаторы YAML обычно сохраняют последнее значение и ничего не сообщают. Если `replicas: 3` появляется дважды, полученное вами JSON выглядит совершенно правильным — и это неправильное число.
Цитирование правил, которые выдержат поездку
JSON более строго относится к строкам, чем YAML, поэтому при преобразовании добавляются кавычки вокруг пустых значений. Это нормально, но две особенности YAML вызывают реальные ошибки: `yes`, `no`, `on` и `off` являются логическими значениями в YAML 1.1, но строки в семантике JSON и значения с начальным нулем, такие как почтовые индексы и номера телефонов, теряют свой нуль, если рассматривать их как числа. Если поле должно оставаться строкой во время преобразования, заключите его в кавычки в источнике.
Запускайте его локально, особенно для конфигураций кластера.
Манифесты Kubernetes обычно содержат учетные данные в объектах `Secret`, строки подключения в ConfigMaps и токены в файлах CI. Вставка их в веб-сервис передает их на сервер, который вы не контролируете. Конвертер на основе браузера выполняет анализ и сериализацию на той же вкладке, которую вы читаете, поэтому ничего не передается, а страница, которая продолжает работать с отключенной сетью, является доказательством этого, а не обещанием.
Разумный рабочий процесс
- Сначала проверьте YAML и исправьте все строки, столбцы и отрывки, о которых сообщается.
- Выберите, как следует обрабатывать файлы, состоящие из нескольких документов: массив или конкретный документ.
- Преобразуйте с отступом, соответствующим стилю вашей кодовой базы (2 или 4 пробела), и отсортируйте ключи, если вы различаете выходные данные.
- Сохраняйте YAML как источник истины в git и рассматривайте JSON как сгенерированный артефакт; комментарии живут только в YAML.
от YAML до JSON — часто задаваемые вопросы
При преобразовании YAML в JSON теряются комментарии?
Да. JSON не имеет синтаксиса комментариев, поэтому каждый комментарий удаляется во время преобразования YAML в JSON. Это основная причина, по которой команды сохраняют YAML в качестве авторского формата и регенерируют JSON как результат сборки, а не наоборот.
Почему мой YAML выдает только сообщение об отступе?
Отступ — это структура YAML. Символ табуляции, один неуместный пробел или клавиша с отступом на один уровень — все это меняет значение документа, поэтому анализаторы останавливаются на первой двусмысленности. Исправление состоит в том, чтобы прочитать указанную строку вместе с отрывком и сравнить ее со строкой выше.
Безопасен ли конвертер YAML в JSON браузера для секретов Kubernetes?
Это когда преобразование происходит полностью на странице. Конвертер YamlBox анализирует локально с помощью встроенной библиотеки YAML, не выполняет сетевые вызовы и продолжает работать с отключенной сетью — поэтому секретный манифест никогда не покидает вкладку.
Инструменты, упомянутые в этом посте
Еще статьи для чтения
5 минута чтения
От JSON до YAML: снова делаем машинный вывод доступным для
Преобразуйте JSON в YAML в браузере с помощью элементов управления отступами и кавычками — и изучите ловушки кавычек, которые превращают чистую конфигурацию в испорченную.
6 минута чтения
JSON форматтер: красивый, минимизированный и действительно
Средство форматирования JSON, которое красиво печатает, минимизирует и проверяет точные местоположения ошибок, а также пять синтаксических ошибок, стоящих почти за каждой недопустимой ошибкой JSON.
6 минута чтения
JSON diff: сравнение данных в том виде, в каком они на самом
Сравните две полезные нагрузки JSON со структурным различием JSON, которое игнорирует порядок ключей и пробелы, выделяет перемещенные значения и показывает, почему текстовые различия вводят в заблуждение.
- Более длинная статья для чтения: YAML против JSON: когда какой использовать (и как
- Более длинная статья для чтения: От Kubernetes от YAML до JSON: вход и развертывание