← Вернуться к блогу

JSON против YAML: Полное сравнение форматов

Детальное сравнение JSON и YAML: синтаксис, производительность, варианты использования. Когда использовать каждый формат.

Big JSON Team11 мин чтенияcomparison
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

11 мин чтения

# JSON против YAML: Полное сравнение форматов

JSON и YAML - два популярных формата для хранения конфигураций и обмена данными. В этом руководстве мы детально сравним оба формата, чтобы помочь вам выбрать подходящий для ваших задач.

Краткий обзор

JSON (JavaScript Object Notation)

  • Создан в 2001 году Дугласом Крокфордом
  • Подмножество JavaScript
  • Строгий синтаксис
  • Широко используется в веб-API

YAML (YAML Ain't Markup Language)

  • Создан в 2001 году
  • Надмножество JSON (валидный JSON - это валидный YAML)
  • Более гибкий синтаксис
  • Популярен в DevOps и конфигурациях

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

Простой объект

JSON:
{

"название": "МоёПриложение",

"версия": "1.0.0",

"автор": "Иван Петров",

"активно": true,

"порт": 8080

}

YAML:
название: МоёПриложение

версия: 1.0.0

автор: Иван Петров

активно: true

порт: 8080

Различия:
  • JSON требует кавычки для ключей
  • YAML использует отступы вместо скобок
  • YAML более читаемый (на 40% меньше символов)

Вложенные объекты

JSON:
{

"база_данных": {

"хост": "localhost",

"порт": 5432,

"учетные_данные": {

"пользователь": "admin",

"пароль": "secret123"

}

}

}

YAML:
база_данных:

хост: localhost

порт: 5432

учетные_данные:

пользователь: admin

пароль: secret123

Преимущество YAML:
  • Визуальная иерархия через отступы
  • Меньше синтаксического шума

Массивы

JSON:
{

"языки": ["JavaScript", "Python", "Java"],

"пользователи": [

{

"имя": "Иван",

"возраст": 30

},

{

"имя": "Мария",

"возраст": 25

}

]

}

YAML:
языки:

- JavaScript

- Python

- Java

пользователи:

- имя: Иван

возраст: 30

- имя: Мария

возраст: 25

Альтернативный синтаксис YAML (inline):
языки: [JavaScript, Python, Java]

пользователи:

- {имя: Иван, возраст: 30}

- {имя: Мария, возраст: 25}

Уникальные возможности YAML

1. Комментарии

JSON:
{

"_комментарий": "Это не настоящий комментарий",

"настройка": "значение"

}

YAML:
# Это настоящий комментарий

настройка: значение # Inline комментарий

2. Многострочные строки

JSON:
{

"описание": "Это очень длинное описание\nс новыми строками\nи продолжением текста"

}

YAML (сохранение переносов):
описание: |

Это очень длинное описание

с новыми строками

и продолжением текста

YAML (без переносов):
описание: >

Это очень длинное описание

с новыми строками

и продолжением текста

3. Якоря и ссылки (DRY)

JSON: Приходится дублировать
{

"разработка": {

"хост": "localhost",

"порт": 3000

},

"тестирование": {

"хост": "localhost",

"порт": 3000

}

}

YAML: Можно переиспользовать
по_умолчанию: &умолчания

хост: localhost

порт: 3000

разработка:

<<: умолчания

debug: true

тестирование:

<<: умолчания

debug: false

4. Типы данных

YAML поддерживает дополнительные типы:
# Null значения

значение1: null

значение2: ~

значение3: # Пустое значение тоже null

# Даты

дата_рождения: 1990-05-15

timestamp: 2026-01-26T10:00:00Z

# Булевы (больше вариантов)

активен: true

удален: false

верифицирован: yes

завершен: no

включено: on

выключено: off

# Числа

целое: 42

восьмеричное: 0o52

шестнадцатеричное: 0x2A

с_подчеркиваниями: 1_000_000

научная_нотация: 1.5e+3

5. Сложные ключи

YAML:
? - первый

- элемент

: значение_для_массива

? {имя: Иван, возраст: 30}

: информация_о_пользователе

Производительность

Скорость парсинга

Тест (10000 операций): JSON (JavaScript):
console.time('JSON парсинг');

for (let i = 0; i < 10000; i++) {

JSON.parse(jsonString);

}

console.timeEnd('JSON парсинг');

// ~50ms

YAML (js-yaml):
const yaml = require('js-yaml');

console.time('YAML парсинг');

for (let i = 0; i < 10000; i++) {

yaml.load(yamlString);

}

console.timeEnd('YAML парсинг');

// ~800ms (в 16 раз медленнее!)

Вывод: JSON значительно быстрее парсится

Размер файлов

Пример конфигурации:

JSON (245 байт):

{"название":"МоёПриложение","версия":"1.0.0","настройки":{"порт":8080,"хост":"localhost","база_данных":{"тип":"postgresql","хост":"db.example.com"}}}

YAML (167 байт):

название: МоёПриложение

версия: 1.0.0

настройки:

порт: 8080

хост: localhost

база_данных:

тип: postgresql

хост: db.example.com

YAML на 32% компактнее (с форматированием)

Варианты использования

Когда использовать JSON

Лучше для:

  • REST API: Стандарт для веб-сервисов
  • Веб-приложения: Нативная поддержка в браузерах
  • Производительность: Быстрый парсинг критичен
  • Простота: Базовые структуры данных
  • Интероперабельность: Поддержка всеми языками

Примеры:
- API ответы
  • Package.json
  • Tsconfig.json
  • Manifest файлы
  • NoSQL данные (MongoDB)

Когда использовать YAML

Лучше для:

  • Конфигурационные файлы: Читаемость важнее скорости
  • CI/CD: GitHub Actions, GitLab CI
  • Инфраструктура как код: Docker Compose, Kubernetes
  • Документация: Комментарии и читаемость
  • Сложные конфигурации: Якоря и переиспользование

Примеры:
- docker-compose.yml
  • .gitlab-ci.yml
  • Kubernetes манифесты
  • Ansible playbooks
  • OpenAPI спецификации

Примеры конфигураций

Docker Compose

docker-compose.yml (YAML предпочтительнее):
version: '3.8'

services:

web:

image: nginx:latest

ports:

- "80:80"

volumes:

- ./html:/usr/share/nginx/html

environment:

- NGINX_HOST=localhost

- NGINX_PORT=80

networks:

- frontend

db:

image: postgres:13

environment:

POSTGRES_PASSWORD: secret

volumes:

- db-data:/var/lib/postgresql/data

networks:

- backend

networks:

frontend:

backend:

volumes:

db-data:

В JSON было бы менее читаемо:
{

"version": "3.8",

"services": {

"web": {

"image": "nginx:latest",

"ports": ["80:80"],

...

}

}

}

API конфигурация

config.json (JSON предпочтительнее):
{

"api": {

"version": "v2",

"baseUrl": "https://api.example.com",

"timeout": 5000,

"retries": 3,

"endpoints": {

"users": "/users",

"products": "/products",

"orders": "/orders"

}

}

}

Обработка ошибок

JSON - Строгие ошибки

{

"имя": "Иван",

"возраст": 30, ← Запятая в конце

}

Ошибка: Немедленный сбой парсинга

YAML - Потенциально опасные ошибки

настройки:

порт: 8080

дополнительно: значение ← Неправильный отступ

Проблема: Может быть интерпретировано неправильно без ошибки!

Конвертация между форматами

JSON → YAML

JavaScript:
const yaml = require('js-yaml');

const jsonData = require('./config.json');

const yamlStr = yaml.dump(jsonData, {

indent: 2,

lineWidth: 120,

noRefs: true

});

console.log(yamlStr);

Python:
import json

import yaml

with open('config.json', 'r') as f:

data = json.load(f)

with open('config.yml', 'w') as f:

yaml.dump(data, f, default_flow_style=False, allow_unicode=True)

YAML → JSON

JavaScript:
const yaml = require('js-yaml');

const fs = require('fs');

const yamlData = yaml.load(fs.readFileSync('config.yml', 'utf8'));

const jsonStr = JSON.stringify(yamlData, null, 2);

fs.writeFileSync('config.json', jsonStr);

Python:
import json

import yaml

with open('config.yml', 'r') as f:

data = yaml.safe_load(f)

with open('config.json', 'w') as f:

json.dump(data, f, ensure_ascii=False, indent=2)

Безопасность

JSON - Безопаснее по умолчанию

// JSON.parse не выполняет код

JSON.parse('{"ключ": "значение"}'); // Безопасно

YAML - Потенциальные уязвимости

# YAML может выполнять код (в некоторых парсерах)

!!python/object/apply:os.system

args: ['rm -rf /']

Решение: Используйте безопасные парсеры
// Безопасно

yaml.safeLoad(yamlString);

// Небезопасно

yaml.load(yamlString);

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

| Характеристика | JSON | YAML |

|----------------|------|------|

| Читаемость | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |

| Скорость парсинга | ⭐⭐⭐⭐⭐ | ⭐⭐ |

| Простота синтаксиса | ⭐⭐⭐⭐ | ⭐⭐⭐ |

| Комментарии | ❌ | ✅ |

| Поддержка браузерами | ✅ | ❌ |

| Размер файла | Больше | Меньше |

| Строгость | Строгий | Гибкий |

| Безопасность | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |

| Типы данных | Базовые | Расширенные |

| Переиспользование | ❌ | ✅ (якоря) |

Лучшие практики

Для JSON

Делайте:

  • Используйте для API
  • Валидируйте с JSON Schema
  • Форматируйте для читаемости (разработка)
  • Минифицируйте для продакшена

Не делайте:

  • Не добавляйте комментарии (они не поддерживаются)
  • Не дублируйте данные
  • Не используйте для больших конфигураций

Для YAML

Делайте:

  • Используйте для конфигураций
  • Добавляйте комментарии
  • Используйте якоря для DRY
  • Проверяйте отступы

Не делайте:

  • Не используйте для API
  • Не смешивайте стили (выберите один)
  • Не используйте небезопасные парсеры
  • Не делайте слишком сложную вложенность

Инструменты

Конвертеры

  • yq: YAML processor (аналог jq)
  • json2yaml.com: Онлайн конвертер
  • yamllint: Линтер для YAML

Валидаторы

  • JSONLint: Для JSON
  • YAML Lint: Для YAML

Заключение

Выбор между JSON и YAML зависит от вашего use case:

Используйте JSON для:
  • API и веб-сервисов
  • Высокопроизводительных приложений
  • Браузерных приложений
  • Простых структур данных

Используйте YAML для:
  • Конфигурационных файлов
  • CI/CD пайплайнов
  • Infrastructure as Code
  • Сложных конфигураций с комментариями

Оба формата имеют свое место в современной разработке. Знание их сильных и слабых сторон поможет вам принимать правильные решения в ваших проектах.

Share:

Похожие статьи

Read in English