JSON

Материал из llmdocs — справочник разработчика
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).

См. также

Источники

  1. RFC 8259 — The JavaScript Object Notation (JSON) Data Interchange Format
  2. ECMA-404 — The JSON Data Interchange Syntax
  3. json.org — Introducing JSON
  4. RFC 7493 — The I-JSON Message Format
  5. JSON Schema
  6. JSON Lines
  7. jq Manual