JSON
JSON
JSON (JavaScript Object Notation) — текстовый формат записи структурированных данных в виде объектов (пар «ключ–значение») и массивов. Это де-факто универсальный язык обмена данными между сервером и клиентом в современном вебе, а также самый ходовой формат для конфигов и логов.
История
- 2001 год, США. Дуглас Крокфорд (Douglas Crockford), сооснователь маленькой компании State Software в Сан-Франциско, ищет способ передавать данные между сервером и браузером без перезагрузки страницы. На дворе расцвет XML; в браузере для асинхронных запросов есть только хаки с невидимым
<iframe>. Крокфорд замечает, что синтаксис литералов объектов в JavaScript ({key: "value", arr: [1, 2, 3]}) сам по себе является валидной программой на JS и при этом достаточно строгий, чтобы быть форматом сериализации. Сам Крокфорд позже говорил: «Я не изобрёл JSON, я его обнаружил». - 2002 год. Запущен сайт
json.org— одностраничник со спецификацией. Все диаграммы синтаксиса умещаются в один экран. Это до сих пор главный «однострочник» по формату. - 2005–2006 годы. Появляется термин AJAX (Asynchronous JavaScript and XML) у Джесси Джеймса Гарретта. Несмотря на «X» в названии, к концу 2000-х из связки AJAX вытесняется XML и встаёт JSON — он легче парсится в браузере (
JSON.parse), занимает меньше места, читается глазами. Это решающий момент: REST + JSON становятся стандартом веб-API. - 2006 год. Опубликован первый RFC — RFC 4627. Документ короткий: десяток страниц.
- 2013 год. Принят стандарт ECMA-404 — официальная спецификация формата от той же организации, что курирует JavaScript.
- 2014 год. RFC 7159 уточняет неясности первого RFC (например, что текст верхнего уровня может быть не только объектом/массивом, но и любым валидным значением).
- 2017 год. Принят финальный (на сегодня) RFC 8259 + ISO/IEC 21778:2017. Эти три документа (ECMA-404, RFC 8259, ISO) описывают один и тот же формат и согласованы между собой.
- Дальнейшие ответвления. Появляются расширения: JSON5 (комментарии, висячие запятые), JSONC (JSON с комментариями, используется в VS Code), JSON Lines / NDJSON (по одному JSON-объекту на строку — для логов), BSON (бинарный JSON от MongoDB), JSON Schema (язык описания структуры JSON-документов).
Самое важное про JSON
Это не «формат данных». Это общий язык, на котором программы, написанные на разных языках, могут договориться о структуре сообщения без предварительного согласования схемы. Сила JSON — не в синтаксисе, а в том, что его поддерживает буквально каждый язык программирования из коробки.
Что это такое
JSON — это текстовый формат, в котором данные записаны как комбинация шести базовых типов:
- Объект:
{"name": "Pavel", "age": 38}— набор пар «ключ-значение». Ключ всегда строка в двойных кавычках. - Массив:
[1, 2, 3, "foo"]— упорядоченный список значений (могут быть разнотипными). - Строка:
"привет"— обязательно в двойных кавычках, поддерживает Unicode и экранирование. - Число:
42,-3.14,1.5e10— без обозначения типа (int/float не различаются на уровне формата). - Булево:
trueилиfalse. null— пустое значение.
Всё. Никаких дат, никаких функций, никаких ссылок, никакой типизации сложнее этого. В этой минимальности — главная сила JSON: его легко распарсить, легко прочитать глазами, легко передать через любой текстовый канал (HTTP, файл, поле в базе, лог).
Сравнение с соседями:
- JSON vs XML. XML — это полноценный язык разметки документа (с атрибутами, namespace, DTD, схемами). JSON беднее: он умеет описывать только дерево данных. Но именно эта бедность делает его быстрее в парсинге и компактнее на проводе. Грубо: XML — машинописная справка с печатями, JSON — записка на холодильнике.
- JSON vs YAML. YAML человекочитаемее (без кавычек, отступы вместо скобок), но синтаксис чувствителен к пробелам и табам, и парсер YAML существенно сложнее. Поэтому YAML почти повсеместен в конфигах для людей (Kubernetes, GitHub Actions, Ansible), а JSON — в обмене данными между машинами.
- JSON vs Protobuf/MessagePack/Avro. Это бинарные форматы. Они в 2–10 раз компактнее и быстрее, но не читаются глазами и требуют общей схемы у обеих сторон. Их выбирают, когда трафик и латентность критичны (gRPC, Kafka c Avro, мобильные клиенты).
- JSON vs TOML. TOML — формат конфигов с фокусом на читаемость и однозначность (используется в
pyproject.toml,Cargo.toml). JSON в конфигах терпим (package.json,tsconfig.json), но без комментариев — что бесит и порождает костыли вроде JSONC.
Аналогии из жизни
Аналогия 1: бланк заказа в кафе.
Официант приносит лист с пунктами: «Имя клиента», «Стол», «Заказ» (список блюд). Кухня читает его и готовит. Это и есть JSON: структурированный, заранее согласованный шаблон, который понимают оба — и тот, кто заполняет, и тот, кто читает.
Где ломается. В кафе можно дописать что-то на полях («без соли, пожалуйста») — и кухня поймёт. В JSON никаких «полей» нет: либо поле описано в схеме и в нём есть значение, либо его нет. Свободные приписки игнорируются или ломают парсер.
Аналогия 2: посылка с описью.
Курьер берёт коробку с описью внутри: «6 книг, 1 ноутбук, 2 кабеля». Получатель сверяет содержимое с описью. Так работают JSON-API: сервер кладёт «опись» в тело ответа, клиент её читает и достраивает интерфейс.
Где ломается. В реальной посылке книгу можно подержать в руках, нюхнуть, проверить состояние. В JSON «описание» и есть сами данные: если в описи написано «6 книг», то это 6 строк, и больше про них ничего узнать нельзя без отдельного запроса. Реальные книги — на сервере, JSON — только их карточки.
Аналогия 3: партитура.
Композитор пишет партитуру, оркестр её играет. Партитура — текст с жёсткими правилами (ключ, размер, ноты). Все, кто умеет читать, играют одинаково. JSON — это партитура для программ: одна запись, любая платформа, одинаковый результат.
Где ломается. В партитуре есть динамика, штрихи, ремарки на естественном языке — «нежно», «con fuoco». JSON эту нюансировку не передаст: чтобы выразить «эту строку показывать жирным», нужно либо договориться о специальном поле ("bold": true), либо завернуть в HTML/Markdown. JSON не знает про оформление.
Как это работает
Жизненный цикл JSON в типичном веб-сценарии — пять шагов.
Шаг 1: сериализация.
В программе есть структура в памяти — объект, словарь, dataclass. Чтобы её передать наружу, библиотека рекурсивно обходит дерево и превращает в строку по правилам формата:
import json
data = {"user": "pavel", "tags": ["dev", "writer"], "active": True}
text = json.dumps(data)
# '{"user": "pavel", "tags": ["dev", "writer"], "active": true}'
Обрати внимание: True в Python превратился в true в JSON — это конвертация между типами языка и формата.
Шаг 2: передача.
Полученная строка отправляется по каналу. Обычно это HTTP — в теле POST-запроса или в теле ответа. В HTTP-заголовке ставится Content-Type: application/json; charset=utf-8. Получатель видит этот заголовок и понимает: «дальше будет JSON в UTF-8».
Шаг 3: парсинг.
На другой стороне библиотека читает строку и строит структуру в памяти:
const text = '{"user": "pavel", "tags": ["dev", "writer"], "active": true}';
const obj = JSON.parse(text);
// obj.user === "pavel"; obj.tags[0] === "dev";
Парсинг — это маленький конечный автомат, который читает символы и опознаёт токены: {, }, [, ], :, ,, строка, число, ключевое слово. Если встречается лишний символ или невалидное число — парсер бросает исключение. JSON строгий: висячая запятая [1, 2, 3,] уже невалидна.
Шаг 4: валидация.
Программа может проверить, что распарсенный объект соответствует ожидаемой форме (JSON Schema, Pydantic, Zod, ajv). Это уже не часть формата — это надстройка, страховка от мусора.
Шаг 5: использование.
Дальше с объектом работают как с обычной структурой языка.
ASCII-схема, как выглядит запрос-ответ:
КЛИЕНТ СЕРВЕР
| |
| POST /api/users HTTP/1.1 |
| Content-Type: application/json |
| |
| {"name":"Pavel","age":38} |
|---------------------------------->|
| |
| | парсит JSON,
| | сохраняет в БД,
| | формирует ответ
| |
| HTTP/1.1 201 Created |
| Content-Type: application/json |
| |
| {"id":42,"created":"2026-05-25"} |
|<----------------------------------|
| |
парсит ответ, |
обновляет UI |
Заметь: дата "2026-05-25" — это просто строка. В формате нет типа «дата», договорённость о ISO-8601 — соглашение между сторонами, не часть JSON.
Где встречается в обычной жизни
- Открываешь карту в браузере — Яндекс.Карты или Google Maps подгружают плитки и метки JSON-ом. Без JSON карта будет дёргаться при каждом скролле.
- Лайкаешь пост в соцсети — кнопка отправляет на сервер крошечный JSON
{"post_id": 12345, "action": "like"}, в ответ приходит обновлённый счётчик. Никакая страница не перезагружается именно потому, что между браузером и сервером бегает JSON. - Бронируешь столик через сайт — форма «дата, время, гости» уезжает JSON-ом в систему ресторана, обратно прилетает «забронировано» или «нет мест».
- Платишь по QR-коду — внутри QR-кода может быть зашит JSON с реквизитами платежа (СБП работает похожим образом).
- Получаешь push-уведомление в мессенджере — Apple Push (APNs) и Firebase Cloud Messaging доставляют сообщение в виде JSON: заголовок, текст, payload, бейдж.
Где встречается в IT и бизнесе
- REST API. 99% публичных и внутренних API сегодня — JSON. Stripe (платежи), Twilio (телефония), Slack, Telegram Bot API, OpenAI API, любая интеграция с CRM/ERP — это запрос JSON-ом, ответ JSON-ом.
- Конфиги.
package.json(Node.js),tsconfig.json,composer.json(PHP), VS Code settings, ESLint правила, GitHubdependabot.json. Удобно версионировать, удобно генерировать программно. - NoSQL-базы. MongoDB, CouchDB, DynamoDB, Firebase — хранят документы как JSON (внутри обычно BSON, бинарный родственник). PostgreSQL и MySQL умеют тип
JSONB/JSONкак полноценное поле с индексами. - Логи. Структурированные логи в формате JSON Lines (одна строка — один JSON-объект) — стандарт в инфраструктуре: Logstash, Elasticsearch, Loki, Promtail. Это даёт возможность фильтровать логи по полям, а не grep-ом.
- Машинное обучение. Датасеты разметки часто лежат как JSON (COCO для детекции, SQuAD для QA). Конфиги обучения, гиперпараметры, метрики — всё в JSON. Сами модели вроде Claude и GPT возвращают ответы в JSON-режиме, когда нужен структурированный вывод.
Кто пользуется
- Все крупные веб-сервисы. GitHub API отдаёт ~1 миллиард JSON-ответов в сутки (порядок оценочный, точную цифру не знаю). Twitter (X) до перехода на v2 — десятки миллиардов JSON-объектов в сутки на твиты и события.
- Финтех. Stripe обрабатывает ~6 миллиардов транзакций в год (данные 2024 года из их пресс-релизов), и каждая — это пара JSON-запрос/ответ.
- Логистика. Внутренние трекинг-API Яндекс.Доставки, СДЭК, FedEx — JSON. Каждое отслеживание посылки в приложении — это серия JSON-запросов.
- Игровая индустрия. Профили игроков, сейвы, балансы валют, конфиги уровней, сетевой синхрон — почти везде JSON или его бинарный родственник.
- DevOps. Kubernetes API внутри говорит на JSON (YAML — это удобная обёртка для людей, на проводе всё равно JSON). AWS, Google Cloud, Azure — все официальные SDK сериализуют запросы в JSON.
Альтернативы и конкуренты
- XML. Плюсы: схемы (XSD), пространства имён, развитые инструменты валидации. Минусы: многословный, парсится медленнее, читать руками тяжело.
- YAML. Плюсы: чрезвычайно читаем для человека, поддерживает якоря и ссылки. Минусы: чувствителен к пробелам, известная проблема «норвежского флага» (
NOпарсится какfalse), много неоднозначностей в стандарте. - TOML. Плюсы: однозначный, читаемый, заточен под конфиги. Минусы: не масштабируется на глубокие иерархии, в обмене данными не прижился.
- Protocol Buffers (Protobuf). Плюсы: в разы быстрее и компактнее JSON, строго типизирован. Минусы: бинарный (отладка глазами невозможна), требует общей
.proto-схемы, тулинг тяжелее. - MessagePack. Плюсы: бинарный JSON, тот же тип данных, но в 2–4 раза компактнее. Минусы: всё ещё нужен MessagePack-парсер на обоих концах, экосистема меньше.
Деньги в JSON — это грабли
JSON не различает целые и дробные, не знает про точность. 19.99 парсится как float и теряет копейки на округлении. Для денег храните строкой ("19.99") или в копейках (1999) — никогда как число с плавающей точкой.
Когда НЕ стоит использовать
- Когда нужны бинарные данные. Картинки, видео, аудио в JSON приходится кодировать в base64 — это раздувает на 33%. В реальных случаях бинарь шлют отдельно (через
multipart/form-dataили S3), а в JSON — только URL/ID. - Когда критична производительность сериализации. В системах с миллионами сообщений в секунду (трейдинг, телеметрия, internal RPC) JSON становится узким горлышком. Тогда переходят на Protobuf, FlatBuffers, MessagePack.
- Когда нужна строгая типизация на уровне формата. JSON не различает целые и дробные, не имеет даты, не имеет десятичных дробей. Финансовая сумма
19.99в JSON может прийти какfloatи потерять точность. Для денег и точных чисел нужны строки или специальные типы — формат сам не защитит. - Когда документ сложнее дерева. Если в данных есть перекрёстные ссылки, циклы, аннотации к узлам — JSON не годится из коробки. Нужен XML, RDF или собственный формат.
Связанные понятия
- JSON Schema — язык описания структуры JSON-документа: какие поля обязательны, каких типов. Аналог XSD для XML.
- JSONPath — язык запросов внутри JSON-документа, аналог XPath. Используется в jq, ELK, тестах API.
- JSON Lines (NDJSON) — соглашение «один JSON-объект на строку», стандарт для стриминговых логов.
- JWT (JSON Web Token) — компактный токен авторизации: три base64-блока с JSON внутри, подписанные ключом. Стандарт
Authorization: Bearer .... - JSON-RPC — протокол удалённого вызова процедур поверх JSON. Альтернатива REST и gRPC, живёт в Ethereum и Bitcoin API.
- BSON — бинарное расширение JSON от MongoDB, поддерживает даты и бинарные данные.
- HATEOAS — практика, когда JSON-ответ содержит ссылки на дальнейшие действия (один из «зрелых» уровней REST по Ричардсону).
Литература и источники
json.org— официальный одностраничный референс (en/ru). Все диаграммы синтаксиса.- RFC 8259 (en) — последняя версия стандарта. Гуглится по «RFC 8259 JSON». 17 страниц, читается за час.
- ECMA-404 (en) — стандарт ECMA, лежит на
ecma-international.org. Самый короткий стандарт в природе. - Wikipedia: «JSON» (ru/en) — приличная обзорная статья с историей и сравнениями.
- Douglas Crockford, «JavaScript: The Good Parts» (O'Reilly, 2008, en) — у Крокфорда там глава про JSON, и заодно понимание, почему формат именно такой.
- Lecture by Douglas Crockford «JSON: The Most Excellent Lingua Franca» (YouTube, en, около 60 мин) — авторский рассказ об истории. Искать «Crockford JSON YouTube».
- «Designing Data-Intensive Applications», Martin Kleppmann (O'Reilly, 2017, en; ru — «Высоконагруженные приложения») — глава 4 «Encoding and Evolution» подробно сравнивает JSON, XML, Protobuf, Avro, Thrift. Лучший текст про выбор формата сериализации.
Где встретилось у меня
Вчера в работе с Claude Code я гонял генерацию меню для бота-тренера: запрашивал у модели валидный JSON с заранее описанной схемой («только эти ID, только эта структура») и парсил ответ в Python. Параллельно в проекте трекера лежали конфиги (config.json), состояния по дням (state/YYYY-MM-DD.json) и логи фактов. То есть JSON работал одновременно в трёх ролях: контракт модель↔код, формат конфига и формат лога. Это и есть его типичная роль — общий «алфавит», на котором программы и сервисы между собой переписываются.
Краткое резюме
- JSON — текстовый формат данных в виде объектов и массивов; шесть базовых типов, без даты, без комментариев, без бинаря.
- Найден Дугласом Крокфордом в 2001 году, стандартизован к 2017 (RFC 8259, ECMA-404, ISO 21778). Победил XML в вебе за счёт простоты.
- Применяется везде: REST API, конфиги, NoSQL, логи, ML-датасеты, токены авторизации. Это лингва франка веба.
- У формата есть слабости: нет даты, нет десятичных дробей, нет комментариев, плохо подходит для бинаря и сверхвысоких нагрузок. Тогда выбирают Protobuf, MessagePack, YAML или TOML.
- Если строишь интеграцию между двумя системами и не знаешь, с чего начать — почти всегда правильный ответ «JSON через HTTP с описанной схемой». Это скучно, но это работает.