JSON
| Полное название | JavaScript Object Notation |
|---|---|
| Автор | Дуглас Крокфорд (популяризация с 2001 года) |
| Стандарты | RFC 8259 (IETF, 2017), ECMA-404 (2013, 2-е изд. 2017) |
| MIME-тип | application/json |
| Расширение | .json |
| Кодировка | UTF-8 (обязательна при обмене между системами) |
| Типы данных | объект, массив, строка, число, true/false, null |
| Производные | JSON Lines, JSON Schema, JSON5, I-JSON |
JSON (англ. JavaScript Object Notation — нотация объектов JavaScript; произносится «джейсон») — простой текстовый формат для представления структурированных данных. Он основан на синтаксисе литералов JavaScript, но не зависит от языка: библиотеки для чтения и записи JSON есть практически везде.[3] JSON — основной формат тел запросов и ответов веб-API (см. REST), конфигурационных файлов (package.json, tsconfig.json), документов в NoSQL-базах и логов; а в мире больших языковых моделей — формат вызова инструментов и структурированных ответов.
История
Дуглас Крокфорд в начале 2000-х годов «открыл» и описал формат, который уже был подмножеством JavaScript, и опубликовал его спецификацию на сайте json.org. Благодаря простоте JSON быстро вытеснил XML из веб-API: браузер мог разобрать его встроенными средствами, а данные читались и человеком. Формат закреплён двумя согласованными стандартами — ECMA-404 и RFC 8259 (2017).[1][2]
Синтаксис
Шесть типов значений:
| Тип | Пример |
|---|---|
| Объект | {"name": "Анна", "age": 31} |
| Массив | [1, 2, "три", null] |
| Строка | "текст с \"кавычками\" и \n переводом строки" |
| Число | 42, -3.14, 6.02e23 |
| Логическое значение | true, false |
| Пусто | null |
{
"id": 1027,
"title": "Статья о JSON",
"tags": ["формат", "веб"],
"published": true,
"author": {"name": "Анна", "email": null},
"rating": 4.8
}
Строгие правила, о которые спотыкаются чаще всего:
- ключи и строки — только в двойных кавычках;
- нет комментариев;
- нет висячих запятых после последнего элемента;
- нет
undefined,NaN,Infinity, дат и двоичных данных — даты обычно передают строкой в формате ISO 8601 ("2026-11-09T12:00:00Z"), двоичные данные — в Base64; - текст для обмена между системами должен быть в UTF-8 (см. Unicode).
Подводные камни
- Числа. Стандарт не ограничивает их точность, но JavaScript хранит все числа как double: целые больше 2⁵³ (9 007 199 254 740 992) теряют точность. Большие идентификаторы поэтому часто передают строками. Профиль I-JSON формализует эти ограничения.[4]
- Повторяющиеся ключи. RFC 8259 говорит лишь, что ключи «должны быть уникальны»; разные парсеры по-разному обрабатывают дубликаты, что уже приводило к уязвимостям.
- Порядок ключей не гарантирован семантически, хотя большинство библиотек его сохраняет.
Работа с JSON
import json
data = json.loads('{"a": 1, "b": [true, null]}') # → {'a': 1, 'b': [True, None]}
text = json.dumps(data, ensure_ascii=False, indent=2)
const obj = JSON.parse(text);
const s = JSON.stringify(obj, null, 2);
В командной строке незаменима утилита jq — язык выборки и преобразования JSON:[7]
curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'
jq -r '.items[] | select(.status == "active") | .name' data.json
jq -c '.[]' big.json > lines.jsonl
python3 -m json.tool file.json проверит синтаксис и красиво отформатирует файл.
Производные форматы
- JSON Lines (JSONL, NDJSON) — по одному JSON-объекту на строку.[6] Такой файл можно читать и дописывать построчно, не загружая целиком; формат популярен для логов, датасетов машинного обучения и пакетных запросов к API моделей.
- JSON Schema — словарь для описания структуры документа: обязательные поля, типы, допустимые значения.[5] Используется для валидации, генерации форм и документации, лежит в основе OpenAPI и описаний инструментов для LLM. В Python схему из моделей строит Pydantic (см. Dataclasses и Pydantic).
- JSON5, JSONC — расширения с комментариями и висячими запятыми для конфигураций, написанных людьми (так устроены настройки VS Code).
JSON и соседние форматы
| Формат | Сильные стороны | Слабые стороны |
|---|---|---|
| JSON | простой, вездесущий, однозначный | без комментариев, многословен |
| YAML | удобен людям, комментарии | неоднозначные правила, отступы; является надмножеством JSON |
| TOML | понятные конфиги (pyproject.toml) |
плохо подходит для глубокой вложенности |
| XML | схемы, пространства имён, атрибуты | громоздкий |
| Protobuf, MessagePack | компактные и быстрые двоичные форматы | нечитаемы без схемы или инструментов |
Для LLM JSON важен вдвойне: модели генерируют его как текст, поэтому API провайдеров предлагают режимы, гарантирующие соответствие ответа заданной схеме, — см. Структурированный вывод (JSON mode).