JSON (JavaScript Object Notation) — это текстовый формат обмена данными: данные записываются как строка по строгим правилам, понятная и человеку, и программе. Важно с самого начала развести две вещи, которые часто путают: JSON — это текст (строка или файл), а объект в памяти программы (dict в Python, object в JavaScript) — это структура, с которой работает код. Перевод между ними и есть две процедуры этой статьи.
Содержание
- Сериализация (создание JSON) — объект языка превращается в строку JSON: в Python это
json.dumps, в JavaScript —JSON.stringify. - Парсинг (чтение JSON), он же десериализация — строка JSON превращается обратно в объект языка: в Python это
json.loads, в JavaScript —JSON.parse.
Сквозная цепочка через всю статью: объект в памяти -> текст JSON -> объект в памяти. Ниже — синтаксис и типы, полные рабочие примеры на Python и JavaScript и разбор типичных ошибок (кодировка, запятые).
Синтаксис и типы значений
JSON строится из пар «ключ — значение» и упорядоченных списков. Ключ — всегда строка в двойных кавычках. Значением может быть один из шести типов:
| Тип в JSON | Как выглядит | Во что превращается в Python | В JavaScript |
|---|---|---|---|
| строка | "текст" (только двойные кавычки) |
str |
string |
| число | 25, 3.14, -1e3 |
int или float |
number |
| логическое | true / false |
True / False |
boolean |
| null | null |
None |
null |
| объект | {"key": ...} |
dict |
object |
| массив | [1, 2, 3] |
list |
array |
Строгие правила спецификации, которые чаще всего нарушают:
- Ключи и строки — только в двойных кавычках
"...", одинарные запрещены. - После последнего элемента запятая не ставится (нет «висящих» запятых).
- Комментариев в JSON нет.
- Отдельного типа для даты нет — дату хранят строкой (например, в формате ISO
"2026-09-18").
В спецификации у чисел нет деления на целые и дробные — это одно семейство number. Разделение на int и float появляется уже при парсинге в конкретном языке.
JSON — это не то же самое, что объект JavaScript
Название вводит в заблуждение: JSON похож на литерал объекта JavaScript, но это разные вещи. JSON — подмножество, набор правил записи текста, и он строже. В объекте JavaScript ключи можно писать без кавычек, значениями бывают функции и undefined, допустимы комментарии — в JSON ничего этого нет. Поэтому не всякий валидный объект JavaScript является валидным JSON, и парсер JSON такой текст отвергнет.
Создание и чтение JSON на Python
Модуль json входит в стандартную библиотеку, устанавливать ничего не нужно. Ниже полный пример, который можно скопировать и запустить.
import json
data = {
"name": "Anna",
"age": 25,
"is_student": False,
"courses": ["Python", "SQL"],
"address": None,
}
# Сериализация: объект Python -> строка JSON
text = json.dumps(data, ensure_ascii=False, indent=2)
print(text)
Фактический вывод (проверено на Python 3.9): обратите внимание, как значения языка легли в типы JSON — False стало false, None стало null.
{
"name": "Anna",
"age": 25,
"is_student": false,
"courses": [
"Python",
"SQL"
],
"address": null
}
Обратная операция — парсинг строки в объект Python:
parsed = json.loads('{"city": "Москва", "year": 2026, "ok": true}')
print(parsed["city"], parsed["year"], parsed["ok"]) # Москва 2026 True
print(type(parsed)) # <class 'dict'>
Пары функций работают так: dumps/loads — со строками (суффикс s = string), а dump/load (без s) — сразу с файлом. Запись и чтение файла:
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
with open("user.json", "r", encoding="utf-8") as f:
restored = json.load(f)
print(restored["name"]) # Anna
Создание и чтение JSON на JavaScript
В JavaScript глобальный объект JSON встроен, подключать ничего не нужно. JSON.stringify создает строку, JSON.parse читает ее.
const data = {
name: "Anna",
age: 25,
isStudent: false,
courses: ["Python", "SQL"],
address: null,
};
// Сериализация: объект JS -> строка JSON
console.log(JSON.stringify(data));
// {"name":"Anna","age":25,"isStudent":false,"courses":["Python","SQL"],"address":null}
// Третий аргумент - отступ для читаемого вида
console.log(JSON.stringify(data, null, 2));
Парсинг строки обратно в объект:
const obj = JSON.parse('{"city": "Москва", "year": 2026, "ok": true}');
console.log(obj.city, obj.year, obj.ok); // Москва 2026 true
console.log(typeof obj); // object
Чтение из файла в Node.js добавляет только шаг получения текста, сам разбор — тот же JSON.parse:
const fs = require("fs");
const raw = fs.readFileSync("user.json", "utf-8");
const restored = JSON.parse(raw);
console.log(restored.name); // Anna
Типичные ошибки и как их читать
Ошибки удобно распознавать по тексту исключения. Разберем две самые частые — кодировку и запятые.
Кодировка: нечитаемые \uXXXX вместо кириллицы
По умолчанию json.dumps в Python экранирует все не-ASCII символы в escape-последовательности. Формально это валидный JSON, но человеку такой файл нечитаем.
import json
print(json.dumps({"city": "Москва"}))
# {"city": "Москва"} <- нечитаемо
print(json.dumps({"city": "Москва"}, ensure_ascii=False))
# {"city": "Москва"} <- как надо
Исправление: передавать ensure_ascii=False и при записи в файл явно указывать encoding="utf-8". В JavaScript JSON.stringify такого экранирования не делает — кириллица остается как есть.
Запятые: висящая запятая ломает парсинг
Запятая после последнего элемента — валидна в коде Python и JavaScript, но запрещена в JSON. Парсер на ней падает.
import json
json.loads('{"a": 1, "b": 2,}')
# json.decoder.JSONDecodeError:
# Expecting property name enclosed in double quotes: line 1 column 17 (char 16)
То же в JavaScript (Node.js 22, движок V8) — текст сообщения зависит от движка и версии, но смысл тот же:
SyntaxError: Expected double-quoted property name in JSON at position 16 (line 1 column 17)
Исправление — убрать лишнюю запятую: {"a": 1, "b": 2}. Сюда же примыкает частая ошибка с кавычками: одинарные кавычки или ключ без кавычек JSON не принимает.
import json
json.loads("{'a': 1}")
# JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Правильно — только двойные кавычки: {"a": 1}. Если структуру JSON нужно не просто прочитать, а проверить на соответствие ожидаемым полям и типам, для этого есть отдельный инструмент — JSON Schema (это самостоятельная тема про валидацию, а не про синтаксис создания и чтения).
Выводы
- JSON — это текстовый формат данных (строка/файл), а
dict/object — объект в памяти программы; путать их не нужно, между ними работают две процедуры. - Создание JSON — это сериализация (
json.dumpsв Python,JSON.stringifyв JavaScript); чтение — это парсинг (json.loadsиJSON.parse). - В JSON шесть типов значений, ключи всегда в двойных кавычках, висящих запятых и комментариев нет; JSON строже, чем литерал объекта JavaScript.
- Две частые ошибки: в Python по умолчанию кириллица экранируется в
\uXXXX(лечитсяensure_ascii=False), а висящая запятая или одинарные кавычки ломают парсинг в обоих языках.
Где применяется / связь с практикой
JSON — это язык, на котором фронтенд и бэкенд обмениваются данными: браузер отправляет запрос, сервер отвечает строкой JSON, а код парсит ее в объект и показывает пользователю. Тот же формат используют конфигурационные файлы, логи и хранилища. Поэтому уверенная работа с сериализацией и парсингом — базовый навык, без которого не обойтись ни в вебе, ни в анализе данных, ни в автоматизации.
Освойте тему на практике
Разобраться с этим на практике, вместе с синтаксисом языка, файлами и работой со структурами данных, помогает курс Python Basic. Если хочется сперва оценить формат и подачу, посмотрите открытые уроки Otus — многие из них бесплатные и проходят онлайн.
Смежные темы: JSON и определение типа контента, HTTP-сервер на Java: серверные основы на примере чата.
FAQ
Чем JSON отличается от XML? Оба — текстовые форматы обмена данными, но JSON компактнее и ближе к структурам языков программирования (объект и массив), а XML использует теги и лучше подходит для документов со сложной разметкой и метаданными.
Можно ли хранить в JSON дату или функцию? Отдельного типа для даты в JSON нет — ее записывают строкой (обычно в формате ISO). Функции хранить нельзя: JSON.stringify просто пропустит поле с функцией, а в Python попытка сериализовать несериализуемый объект вызовет TypeError.
Что делать, если пришел невалидный JSON от внешнего API? Оборачивать парсинг в обработку исключений: try/except json.JSONDecodeError в Python и try/catch вокруг JSON.parse в JavaScript — так сбой одного ответа не уронит всю программу.



