JSON встречается в работе разработчика каждый день: ответы API, конфиги, localStorage, вебхуки. Большинство умеет с ним работать — но не все понимают нюансы, из-за которых приложения ломаются в продакшне.
В этой статье — всё, что нужно знать о JSON: спецификация, распространённые ошибки, инструменты для форматирования и отладки.
Что такое JSON и почему он стал стандартом
JSON (JavaScript Object Notation) — текстовый формат обмена данными, описанный в RFC 8259. Несмотря на название, JSON не зависит от JavaScript — его поддерживают все современные языки: Python, Go, Rust, PHP, Java, Ruby.
До JSON доминировал XML. Он был мощным, но громоздким: теги занимали больше места, чем данные. JSON предложил компромисс — читаемый людьми формат с минимальным оверхедом. В 2005–2010 годах REST API на JSON вытеснил SOAP/XML почти везде.
Сегодня JSON — это:
- Формат ответов большинства REST API
- Формат конфигов:
package.json, tsconfig.json, .eslintrc
- Формат хранения данных в NoSQL-базах (MongoDB, Firestore)
- Формат обмена в вебхуках (Telegram, Stripe, GitHub)
- Формат хранения состояния в localStorage/sessionStorage
Синтаксис JSON: полная спецификация
JSON поддерживает шесть типов данных:
{
"строка": "текст в двойных кавычках",
"число": 42,
"дробное": 3.14,
"булево": true,
"пустое": null,
"массив": [1, 2, 3],
"объект": { "ключ": "значение" }
}
Несколько правил, которые нарушают чаще всего:
Только двойные кавычки. Одиночные кавычки — ошибка. Строки 'text' и 'key' не являются валидным JSON.
Ключи объектов — всегда строки. {name: "Ivan"} — это JavaScript, но не JSON. В JSON обязательно: {"name": "Ivan"}.
Нет trailing comma. Запятая после последнего элемента запрещена:
// Ошибка
{"a": 1, "b": 2,}
// Правильно
{"a": 1, "b": 2}
Нет комментариев. JSON не поддерживает // и /* */. Если нужны комментарии в конфиге — используйте JSONC или YAML.
Нет специальных числовых значений. NaN, Infinity, -Infinity — не JSON. Их нужно заменить на null или строку.
Форматирование JSON: зачем и как
Сырой JSON из API выглядит так:
{"id":1,"name":"Иван Петров","email":"ivan@example.ru","orders":[{"id":101,"total":2500},{"id":102,"total":1800}]}
После форматирования:
{
"id": 1,
"name": "Иван Петров",
"email": "ivan@example.ru",
"orders": [
{
"id": 101,
"total": 2500
},
{
"id": 102,
"total": 1800
}
]
}
Читаемость — главная цель форматирования. Отладка, код-ревью, документирование API — везде отформатированный JSON понятнее.
Форматирование в разных инструментах
Браузер: воспользуйтесь нашим JSON форматировщиком онлайн — вставьте JSON, нажмите «Форматировать». Работает без регистрации, данные не покидают браузер.
JavaScript:
const formatted = JSON.stringify(data, null, 2); // 2 пробела
const formatted4 = JSON.stringify(data, null, 4); // 4 пробела
Python:
import json
formatted = json.dumps(data, indent=2, ensure_ascii=False)
Терминал (jq):
cat response.json | jq .
# или
curl https://api.example.com/data | jq .
Postman: автоматически форматирует ответ на вкладке «Pretty».
Минификация JSON: когда убирать пробелы
Минификация убирает все незначимые пробелы и переносы строк. Цель — уменьшить размер.
// До минификации — 120 байт
{
"user": {
"id": 1,
"name": "Иван"
}
}
// После — 33 байта
{"user":{"id":1,"name":"Иван"}}
Когда минификация важна:
- API-ответы с высокой нагрузкой. 1000 запросов в секунду × 2 КБ экономии = 2 МБ/сек меньше трафика.
- Хранение в Redis. Меньше байт — дешевле хранение и быстрее сериализация.
- Передача в URL-параметрах. Минифицированный JSON легче закодировать в Base64 и передать как query-параметр.
Минифицировать JSON для передачи в API умеет любой клиент автоматически. Явная минификация нужна при сохранении или ручной передаче данных. Попробуйте JSON минификатор онлайн — он мгновенно убирает все лишние символы.
Валидация JSON: как найти ошибку
Типичные ошибки и их сообщения
Unexpected token ' in JSON at position 0
Использованы одиночные кавычки. Замените все ' на ".
Unexpected token } in JSON at position 45
Лишняя запятая перед закрывающей скобкой, или отсутствует значение.
Unexpected end of JSON input
Незакрытая скобка или кавычка. Проверьте баланс {, [, ".
Unexpected token n in JSON at position 12
Встречается при передаче undefined — в JSON его нет, нужно заменить на null.
Валидация в коде
JavaScript:
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch {
return false;
}
}
Python:
import json
def is_valid_json(s: str) -> bool:
try:
json.loads(s)
return True
except json.JSONDecodeError:
return False
Go:
import "encoding/json"
func isValidJSON(s string) bool {
return json.Valid([]byte(s))
}
Валидация схемы (JSON Schema)
Проверить, что JSON не просто синтаксически верен, а соответствует ожидаемой структуре — задача JSON Schema. Это стандарт описания структуры JSON-документов.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["id", "name", "email"],
"properties": {
"id": { "type": "integer" },
"name": { "type": "string", "minLength": 1 },
"email": { "type": "string", "format": "email" }
}
}
В Python — библиотека jsonschema, в JS — ajv. Это особенно полезно при валидации входящих данных в API.
JSON vs другие форматы
JSON vs XML
| Критерий |
JSON |
XML |
| Читаемость |
Высокая |
Средняя |
| Размер |
Меньше |
Больше |
| Поддержка типов |
Базовая |
Через схему |
| Комментарии |
Нет |
Есть |
| Атрибуты |
Нет |
Есть |
XML всё ещё встречается в SOAP API и некоторых enterprise-системах (1С, банки). Для новых проектов — JSON.
JSON vs YAML
YAML — надмножество JSON (любой JSON является валидным YAML). YAML читается приятнее, поддерживает комментарии, многострочные строки. Используется в конфигах (Docker Compose, Kubernetes, GitHub Actions).
# YAML
user:
id: 1
name: Иван
tags:
- admin
- editor
// JSON
{
"user": {
"id": 1,
"name": "Иван",
"tags": ["admin", "editor"]
}
}
Для API-данных — JSON. Для конфигов инфраструктуры — YAML.
JSON vs MessagePack / Protocol Buffers
Когда производительность критична, бинарные форматы выигрывают: MessagePack компактнее JSON в 1.5–3 раза, Protocol Buffers ещё компактнее и типизированы. Используются в высоконагруженных системах, мобильных приложениях, микросервисах.
Для обычных веб-приложений разница несущественна — JSON удобнее.
Работа с JSON в реальных проектах
Сериализация дат
Один из частых источников проблем. JSON не имеет типа «дата» — используйте ISO 8601:
{
"createdAt": "2026-04-08T10:30:00Z",
"birthDate": "1990-03-15"
}
Не используйте Unix timestamp в явном виде — он нечитаем при отладке. Не используйте локализованные форматы вроде 08.04.2026 — они не поддаются сортировке.
Большие числа
JavaScript работает с числами как float64 — целые числа больше 2⁵³ теряют точность. Типичная проблема: ID из базы данных на 64-битном целом приходит в JavaScript и «округляется».
Решение — передавать большие числа как строки:
{
"id": "9007199254740993",
"amount": "1234567890123456"
}
Именно так поступает Twitter API с tweet ID, и именно поэтому Telegram Bot API возвращает chat_id как число, но рекомендует обрабатывать его как строку.
Вложенность и производительность
Глубоко вложенные JSON-структуры медленнее парсятся и занимают больше памяти. Если API возвращает объекты с уровнем вложенности 8–10+ — это сигнал к рефакторингу схемы данных.
Для мобильных клиентов оптимально держать вложенность не больше 3–4 уровней и использовать плоские структуры с ID-ссылками вместо полного вложения объектов.
Инструменты для работы с JSON
В браузере
- JSON форматировщик Feature IT — форматирование, минификация, валидация. Данные не покидают браузер.
- JSONLint — популярный валидатор с подсветкой ошибок
- JSON Crack — визуализация JSON как граф (удобно для сложных структур)
В терминале
jq — must-have для работы с JSON в командной строке:
# Получить конкретное поле
curl https://api.github.com/users/torvalds | jq '.name'
# Фильтрация массива
cat users.json | jq '.[] | select(.age > 25)'
# Преобразование структуры
cat data.json | jq '{id: .user_id, name: .full_name}'
Python one-liner:
python3 -m json.tool response.json
# или для красивого вывода:
cat response.json | python3 -m json.tool | less
В редакторах кода
- VS Code: встроенная команда «Format Document» (Shift+Alt+F) форматирует JSON. Расширение «Prettier» добавляет автоформатирование при сохранении.
- JetBrains IDE: встроенный форматировщик, плагин JSON Schema для валидации.
В коде
JavaScript/TypeScript:
// Безопасный парсинг с фолбэком
function safeParse<T>(json: string, fallback: T): T {
try {
return JSON.parse(json) as T;
} catch {
return fallback;
}
}
// Сериализация с обработкой циклических ссылок
import stringify from 'safe-stringify';
Python:
import json
from typing import Any
# Сохранение с отступами и кириллицей
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
# Загрузка из файла
with open('input.json', encoding='utf-8') as f:
data = json.load(f)
Итого
JSON — простой формат с несколькими важными ограничениями. Большинство проблем в реальных проектах возникает из-за:
- Неправильного синтаксиса (одиночные кавычки, trailing comma)
- Несогласованного формата дат
- Потери точности при работе с большими числами в JavaScript
- Отсутствия валидации входящих данных по схеме
Держите JSON форматировщик под рукой для быстрой отладки. Для серьёзных проектов — настраивайте JSON Schema валидацию на уровне API.
Если работаете с REST API и нужна помощь с архитектурой или разработкой — расскажите нам о проекте.