JSON: что это и откуда взялся
JSON (JavaScript Object Notation) - текстовый формат для хранения и передачи структурированных данных. Это обычный текст, который легко читает человек и быстро разбирает программа. Формат вырос из синтаксиса объектов JavaScript, его популяризировал Дуглас Крокфорд в начале 2000-х, но сегодня JSON не зависит от языка: с ним работают Python, Java, Go, PHP, C# и практически всё остальное.
Формат описан двумя стандартами: RFC 8259 (IETF, 2017) и ECMA-404. Несколько формальных фактов, которые пригодятся:
- расширение файла -
.json; - MIME-тип для HTTP -
application/json; - кодировка при обмене между системами - UTF-8;
- комментарии стандартом не предусмотрены.
Где вы встретите JSON: ответы веб-API, конфиги (package.json в Node.js, settings.json в VS Code, tsconfig.json), экспорт данных из сервисов, поля типа JSON и JSONB в PostgreSQL, логи в структурированном виде. Как JSON используется в обмене между клиентом и сервером, подробно показано в статье что такое API.
Синтаксис JSON за 5 минут
Весь формат держится на двух структурах: объект и массив.
- Объект - пары "ключ: значение" в фигурных скобках
{}, пары разделяются запятыми. - Массив - упорядоченный список значений в квадратных скобках
[].
Значением может быть строка, число, true, false, null, объект или массив. Вложенность не ограничена. Пример карточки студента:
{
"name": "Иван Петров",
"age": 21,
"gpa": 4.6,
"is_student": true,
"mentor": null,
"skills": ["Python", "SQL", "Git"],
"address": {
"city": "Москва",
"metro": "Бауманская"
}
}
Строгие правила, на которых спотыкаются чаще всего:
- Ключи - только строки и только в двойных кавычках.
{name: "Иван"}и{'name': 'Иван'}- невалидный JSON. - После последнего элемента запятой нет.
true,false,nullпишутся строчными буквами.- Числа без ведущих нулей и без кавычек.
NaNиInfinityне допускаются. - Спецсимволы в строках экранируются обратным слешем:
\",\\,\n.
Типы данных JSON в Python и JavaScript
При разборе JSON каждое значение превращается в родной тип языка. Таблица соответствий для двух самых популярных языков:
| JSON | Python | JavaScript |
|---|---|---|
| object | dict | Object |
| array | list | Array |
| string | str | string |
| number (целое) | int | number |
| number (дробное) | float | number |
| true / false | True / False | true / false |
| null | None | null |
Дат в JSON нет. Их передают строкой, обычно в формате ISO 8601: "2026-10-24T12:30:00Z", и превращают в объект даты вручную. То же с множествами, Decimal и бинарными данными: всё это нужно явно конвертировать.
Ещё одна ловушка: в Python кортеж при сериализации станет массивом, а после обратного чтения вернётся уже списком. Числовые ключи словаря превратятся в строки: {1: "a"} после круга dumps/loads станет {"1": "a"}.
Как работать с JSON в Python
В Python есть встроенный модуль json, ничего ставить не нужно. Четыре функции покрывают 95% задач. Запомнить просто: буква s на конце означает string.
json.loads(строка)- строка JSON в объект Python;json.dumps(объект)- объект Python в строку JSON;json.load(файл)- читает JSON из открытого файла;json.dump(объект, файл)- пишет JSON в файл.
import json
user = {"name": "Анна", "langs": ["Python", "Go"], "active": True}
# запись в файл
with open("user.json", "w", encoding="utf-8") as f:
json.dump(user, f, ensure_ascii=False, indent=2)
# чтение из файла
with open("user.json", encoding="utf-8") as f:
data = json.load(f)
print(data["langs"][0]) # Python
Два параметра, без которых кириллица превращается в кашу:
ensure_ascii=False- оставляет русские буквы как есть вместо\u0410\u043d\u043d\u0430;encoding="utf-8"вopen()- иначе на Windows файл может открыться в кодировке cp1251 и упасть с UnicodeDecodeError.
Параметр indent=2 добавляет отступы для читаемости, sort_keys=True сортирует ключи. Для собственных классов используйте аргумент default: json.dumps(obj, default=str) превратит даты и прочие несериализуемые объекты в строки. Если вы только начинаете путь в языке, пригодится план изучения Python с нуля.
JSON в JavaScript: parse и stringify
В JavaScript работа с JSON встроена в глобальный объект JSON:
const text = '{"name": "Анна", "age": 25}';
const user = JSON.parse(text); // строка -> объект
console.log(user.age + 1); // 26
const back = JSON.stringify(user, null, 2); // объект -> строка с отступами
localStorage.setItem("user", back);
Ответ сервера при fetch разбирают методом response.json(), он возвращает промис. Чего ждать от JSON.stringify:
- свойства со значением
undefinedи функции просто пропадают; - объект
Dateпревращается в строку ISO; NaNиInfinityстановятсяnull;- циклические ссылки вызывают TypeError;
BigIntбез своей обработки тоже бросает TypeError.
Глубокое копирование через JSON.parse(JSON.stringify(obj)) всё ещё встречается в старом коде, но из-за потерь выше лучше использовать встроенную функцию structuredClone(obj). Другие приёмы работы с данными в JS разобраны в материале про методы массивов JavaScript.
Частые ошибки в JSON и как их исправить
Парсер JSON не прощает ни одной лишней запятой. Самые частые ситуации:
| Симптом | Причина | Что сделать |
|---|---|---|
| Expecting property name enclosed in double quotes | Одинарные кавычки или ключ без кавычек. В старых версиях Python так же выглядит лишняя запятая в конце объекта | Заменить кавычки на двойные, убрать висячую запятую |
| Expecting value: line 1 column 1 (char 0) | Пустая строка или вместо JSON пришёл HTML (например, страница ошибки 502) | Проверить код ответа и содержимое перед разбором |
| Extra data | В файле несколько объектов подряд | Обернуть в массив или читать построчно как JSON Lines |
| Unexpected UTF-8 BOM | Файл сохранён в "UTF-8 с BOM" (часто Блокнот в Windows) | Открывать с encoding="utf-8-sig" или пересохранить без BOM |
| Unexpected token в JS | Комментарии, одинарные кавычки, undefined | Удалить комментарии, проверить строку валидатором |
Отдельный подвох Python: json.dumps(float("nan")) по умолчанию выдаёт NaN, хотя это невалидный JSON, и другой язык его не прочитает. Передайте allow_nan=False, чтобы получать ошибку сразу, а не у потребителя данных.
Если API вернул "Expecting value", не чините JSON. Распечатайте первые 200 символов ответа: print(r.status_code, r.text[:200]). В девяти случаях из десяти там окажется HTML-страница с ошибкой, редирект на авторизацию или пустой ответ.
Как открыть, проверить и отформатировать JSON-файл
JSON - обычный текст, открыть его можно любым редактором. Но для больших файлов есть способы удобнее:
- VS Code. Подсветка и проверка синтаксиса из коробки. Форматирование - Shift+Alt+F в Windows и Linux, Shift+Option+F в macOS. Как настроить редактор под себя, рассказано в статье про настройку VS Code.
- Браузер. Firefox показывает JSON в виде дерева со сворачиванием и фильтром. В Chrome и Яндекс Браузере есть похожий просмотрщик, а также расширения.
- Python из терминала. Встроенная утилита проверяет и красиво печатает файл:
python -m json.tool data.json python -m json.tool --sort-keys data.json pretty.json - jq. Консольная утилита для выборок из JSON, незаменима при работе с API:
curl -s https://api.github.com/users/octocat | jq '.login, .public_repos' jq '.items[] | select(.price > 1000) | .name' products.json
Онлайн-валидаторы тоже работают, но не вставляйте туда токены, персональные данные и выгрузки из рабочих баз: вы не знаете, что сайт делает с текстом.
JSON, XML, YAML, CSV: когда что выбрать
JSON не единственный текстовый формат данных, и у каждого своя ниша:
- XML - многословнее, зато умеет атрибуты, пространства имён и строгие схемы XSD. Живёт в SOAP-сервисах, банковских обменах, офисных документах.
- YAML - надмножество JSON с отступами вместо скобок и с комментариями. Любим DevOps-инженерами: конфиги Docker Compose, Kubernetes, GitHub Actions. Минус - чувствительность к пробелам.
- CSV - плоские таблицы, удобно открывать в Excel. Вложенность не поддерживает.
- JSON Lines (
.jsonl) - по одному JSON-объекту на строку. Подходит для логов и больших выгрузок: файл можно читать построчно, не загружая целиком в память.
Для обмена данными по сети и хранения настроек приложений JSON остаётся выбором по умолчанию. Когда нужна проверка структуры, к нему добавляют JSON Schema: отдельный файл описывает обязательные поля и их типы, а библиотека проверяет документы автоматически. Больше практики по языкам ищите в разделах Python и JavaScript.
