JSON срещу YAML: разлики и случаи на използване

JSON и YAML са двата най-често срещани текстови формата за сериализиране най-използван за описание на структурирани данни: конфигурация на приложение, API полезен товар, инфраструктурни файлове, манифести на Kubernetes, CI/CD тръбопроводи. И двете представляват едно и също фундаментални структури (обекти, списъци, скалари), но с различни философии: JSON предпочита машинната четимост и универсалността, YAML се фокусира върху човешката четимост и лаконичност. Тази статия сравнява двата формата точка по точка, за да ви помогне да изберете.

Какво е JSON?

JSON (JavaScript Object Notation) е формат за сериализиране, въведен от Дъглас Крокфорд в началото на 2000-те години извлече синтаксис на JavaScript обектен литерал. Стандартизиран от RFC 8259 и ECMA-404, той днес е основният формат на мрежата: почти всички REST API, NoSQL бази данни и Frontend конфигурациите го използват.

JSON се основава на две структури:

  • Подредена колекция от двойки ключ-стойност (обектът, ограден във къдрави скоби)
  • Подреден списък от стойности (масив, в квадратни скоби)

Скаларните стойности са низ, число, true, false или null. Низовете трябва да бъдат оградени с кавички. двойки. JSON не поддържа коментари.

Какво е YAML?

YAML (YAML Ain't Markup Language) е формат, появил се през 2001 г., проектиран от самото начало да се чете от човек. Текущата спецификация е YAML 1.2.2. Неговата отличителна характеристика: използва отстъп, за да изрази йерархия, като Python.

YAML е надмножество на JSON от версия 1.2: всеки валиден JSON документ е документ Валиден YAML. Но YAML добавя много: коментари, низове без кавички, многоредове, котви и псевдоними, тагове за явно въвеждане, множество документи в един и същи файл (---).

Сравнителен синтаксис

Ето същата структура, изразена и в двата формата.

JSON

<пре>{ "име": "cdrn", "версия": "1.14", "тагове": ["seo", "инструменти", "отворен код"], "автор": { "име": "Адриен", "имейл": "contact@example.com" }, "активен": вярно, "звезди": нула }

YAML

# Конфигурация на проекта
име: cdrn
версия: "1.14"
тагове:
  - SEO
  -инструменти
  - отворен код
автор:
  име: Адриан
  имейл: contact@example.com
активно: вярно
звезди: нула

В същото съдържание YAML заема приблизително същия брой редове, но избягва фигурни скоби, скоби, завършващи запетаи и кавички на повечето низове. Коментари (редове #) са разрешени.

Поддържани типове

JSON познава 6 типа: обект, масив, низ, число, булев, null. Без родна дата, без двоичен файл, няма изрично разграничение цяло число/float.

YAML 1.2 познава същото като JSON и добавя: ISO 8601 времеви отпечатъци, двоични (base64 кодирани чрез етикет !!binary), отделни цели числа и плаващи числа, безкрайност, NaN и персонализирани типове чрез тагове (!!str, !!int, !!float...). YAML 1.1 се приема yes/no/on/off като булеви стойности: класически капан със стари парсери.

Производителност и екосистема

JSON обикновено е 3 до 10 пъти по-бърз за анализиране от YAML и неговите анализатори са достъпни навсякъде (интегрирани във времето за изпълнение на почти всички езици). библиотеки YAML са по-тежки, защото управляват по-богата граматика (котви, тагове, мулти-документи).

От страна на екосистемата: JSON доминира HTTP API, NoSQL бази данни (MongoDB, CouchDB), файлове package.json, composer.json, tsconfig.json. YAML се утвърди за конфигурация на приложения и инфраструктура като код: Symfony, Spring Boot, Rails, Docker Compose, Kubernetes, GitHub Actions, GitLab CI, Ansible.

Сравнителна таблица

Критерий JSON YAML
Четимост от хораДобърОтличен
Машинна четимостОтличнаПравилна
КоментариНеДа (#)
Значителна вдлъбнатинаНеДа
Скорост на анализиранеБързоПо-бавно
Разширени типове (дата, двоичен)НеДа
Котви / псевдонимНеДа
Типични случаи на употребаAPI, съхранение, обмен на данниКонфигурация, infra-as-code

Типични случаи на употреба

Изберете JSON, когато

  • Проектирате REST API или крайна точка на уеб кукичка
  • Вие съхранявате данни в NoSQL база данни или кеш
  • Вие обменяте данни между фронтенд и бекенд
  • Ефективността на синтактичния анализ е критична (висока пропускателна способност, предимство)
  • Искате универсално поддържан формат без зависимости

Изберете YAML, когато

  • Пишете ръчно редактирана конфигурация на приложение
  • Необходима ви е обратна връзка, за да документирате опциите
  • Вие пишете Kubernetes, Docker Compose, GitHub Actions, Ansible
  • Искате да факторизирате блокове с котви и псевдоними
  • Четимостта има предимство пред скоростта на обработка

Препоръка

Простото правило: JSON за машината, YAML за човека. Ако вашият файл е произведени или консумирани от програма, вземете JSON. Ако е написано и коригирано на ръка, вземете YAML. Много екосистеми приемат и двете: Symfony чете YAML, JSON и XML за своите конфигурации, Kubernetes приема и двете за своите манифести. Когато се съмнявате, отидете на YAML за Човешка конфигурация и JSON за автоматизирани потоци.

Можете да тествате конвертирането от един формат в друг с нашия JSON / YAML конвертор и бързо форматирайте документ с JSON формат.

Често задавани въпроси

YAML по-бавен ли е от JSON?

Да, като общо правило, синтактичният анализ на YAML документ струва няколко пъти повече CPU, отколкото парсването на същия JSON документ, тъй като граматиката на YAML е по-богата (отстъп, тагове, котви). в на практика разликата е незначителна за конфигурационните файлове. Става чувствителен, когато анализирате десетки хиляди документи отново и отново.

Можем ли автоматично да конвертираме YAML в JSON?

Да: всеки YAML документ може да бъде конвертиран в JSON без загуба, ако избягвате YAML типове специфични (времеви отпечатъци, котви). Обратното е още по-просто, JSON е подмножество от YAML 1.2. Нашите конвертор върви и в двете посоки.

JSON приема ли коментари?

Не, стандартът JSON ги забранява. Съществуват диалекти (JSON5, JSONC), но не са универсално поддържан. Ако имате нужда от коментари, вземете YAML или TOML.

Защо Kubernetes използва YAML, а не JSON?

Манифестите на Kubernetes се пишат и преглеждат от хора. YAML предлага коментари, а по-малко шумен синтаксис и възможност за факторизиране чрез котви. Kubernetes API приема също JSON, но идиоматичното използване остава YAML.

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

Да от YAML 1.2: всеки валиден JSON документ е валиден YAML документ. Това позволява за вграждане на JSON в YAML файл, без да го модифицирате, което е практично за блокове генерирани или копирани и поставени.