JSON против YAML: Полное сравнение форматов
Детальное сравнение JSON и YAML: синтаксис, производительность, варианты использования. Когда использовать каждый формат.
Big JSON Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# 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 и веб-сервисов
- Высокопроизводительных приложений
- Браузерных приложений
- Простых структур данных
- Конфигурационных файлов
- CI/CD пайплайнов
- Infrastructure as Code
- Сложных конфигураций с комментариями
Оба формата имеют свое место в современной разработке. Знание их сильных и слабых сторон поможет вам принимать правильные решения в ваших проектах.
Похожие статьи
Что такое JSON? Полное руководство для начинающих
Узнайте, что такое JSON, его синтаксис, типы данных и области применения. Полное руководство для начинающих по JavaScript Object Notation.
Файл JSON: Полное руководство по работе с .json файлами
Узнайте всё о файлах JSON: как их создавать, открывать, редактировать и использовать в различных приложениях и языках программирования.
JSON vs XML: Подробное сравнение форматов данных
Детальное сравнение JSON и XML: синтаксис, производительность, использование, преимущества и недостатки. Узнайте, какой формат выбрать для вашего проекта.