YamlBox

Статья-путеводитель · 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, с комментариями, объясняющими почему.

Безопасное преобразование

  1. Знайте свои многодокументные файлы. Набор манифестов k8s, разделенный ---, должен стать массивом JSON, а не просто первым документом. Используйте конвертер, который сообщает, сколько документов он нашел.
  2. Укажите числа, которые являются идентификаторами. «1.10» — версия; 1,10 — это плавающее число. Включите принудительные кавычки при преобразовании в YAML, если значения представляют собой строки, которые выглядят числовыми.
  3. Наблюдайте за исчезновением комментариев. Преобразование в JSON по определению происходит с потерями; если комментарии имеют значение, оставьте YAML в качестве источника и генерируйте JSON только во время сборки.
  4. Подтвердить с точными ошибками. Ошибки отступов в некоторых инструментах приводят к вводящим в заблуждение сообщениям; убедитесь, что у вас отображаются строка и столбец.

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

Общие вопросы

Является ли YAML надмножеством JSON?

YAML 1.2 разработан как надмножество — действительный JSON обычно действителен YAML. Но YAML 1.1 (все еще существует) в некоторых крайних случаях отличается, а вкладки, повторяющиеся клавиши и некоторые строки анализируются по-разному в разных движках. Относитесь к фразе «технически допустимо YAML» как к забавному факту, а не как к стратегии миграции.

Что быстрее разбирать?

Парсеры JSON обычно работают быстрее и проще, поскольку грамматика меньше; Собственный синтаксический анализ JSON существует в каждой среде выполнения. Для конфигурационных файлов разница не имеет значения — вы анализируете их один раз при запуске.