JSON: создание и чтение с примерами на Python и JavaScript

JSON: создание и чтение с примерами на Python и JavaScript Полезное

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 — так сбой одного ответа не уронит всю программу.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)