JSON (JavaScript Object Notation) — текстовый формат для обмена данными, удобный для людей и машин. Он возник в экосистеме JavaScript, но стал язык-независимым стандартом для API, конфигураций и документных хранилищ. Формат простой: объекты (пар «ключ: значение») и массивы — это основные строительные блоки.
Почему Python-разработчику это важно:
🔘 JSON часто используется в web-API, логах, конфигурациях и при обмене данными между сервисами.
🔘 Python имеет встроенный модуль json, который делает сериализует (Python → JSON) и десериализует (JSON → Python).
Синтаксис JSON
🔘 Строки — в двойных кавычках (
"...");🔘 Логические значения — в нижнем регистре:
true / false (в Python — True / False);🔘 Отсутствующее значение —
null (в Python → None);🔘 Нельзя оставлять комментарии и нельзя ставить завершающие запятые после последнего элемента.
Валидный JSON:
{
"name": "Frieda",
"isDog": true,
"hobbies": ["eating", "sleeping"],
"age": 8,
"address": {"home": ["Berlin", "Germany"], "work": null}
}
Модуль json
Главные функции одноименного модуля стандартной библиотеки:
🔘
json.dumps(obj, **opts) — сериализует Python-объект в строку JSON;🔘
json.dump(obj, fp, **opts) — сериализует и записывает в файл-объект;🔘
json.loads(s) — парсит JSON-строку в Python-объект;🔘
json.load(fp) — считывает JSON из файла и парсит.Эти функции следуют стандартному отображению типов: словари → объекты, списки → массивы, строки → строки, числа → числа,
True / False → true / false, None → null.
import json
data = {"name": "Frieda", "age": 8, "is_dog": True}
s = json.dumps(data) # --> '{"name": "Frieda", "age": 8, "is_dog": true}'
obj = json.loads(s) # --> {'name': 'Frieda', 'age': 8, 'is_dog': True}
Полезные параметры dumps / dump
При сериализации полезны параметры:
🔘
indent — делает вывод читабельным (pretty print) (например, indent=2);🔘
sort_keys=True — сортирует ключи объекта по алфавиту;🔘
separators — позволяет контролировать символы между элементами (полезно для минификации);🔘
ensure_ascii=False — по умолчанию json экранирует не-ASCII символы; если хотите сохранить UTF-8 в читаемом виде, ставьте False;🔘
skipkeys=True — пропускает неподдерживаемые типы ключей вместо TypeError (использовать осторожно — вы можете потерять данные).Маппинг типов
При загрузке JSON в Python выполняется обратное отображение типов:
*
object → dict*
array → list*
string → str*
number → int / float*
true`/`false → True`/`False*
null → NoneJSON-ключи — всегда строки. Если у вас в исходном Python-словаре были числовые ключи (например
{1: "a"}`), при сериализации они станут строками (`"1"`). После `json.loads() вы получите ключи как строки — Python не "угадает" исходный тип. Это частая ловушка при конвертации словарей ключами-числами.Полезные утилиты и приёмы
🔘
python -m json.tool — встроенная утилита для форматирования/проверки JSON в терминале (можно использовать для prettify/minify);🔘 Онлайн-валидаторы (например, JSONLint) и редакторы с подсветкой помогут быстро найти синтаксические ошибки (комментарии, лишние запятые и т. п.).
Подборка примеров
Читаем JSON из файла:
import json
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
Записываем с красивым форматированием:
with open("data_pretty.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, sort_keys=True, ensure_ascii=False)
Сериализуем datetime:
from datetime import datetime
import json
def default(o):
if isinstance(o, datetime):
return o.isoformat()
raise TypeError
json.dumps({"now": datetime.utcnow()}, default=default)
Проверяем валидность JSON в CLI
python -m json.tool input.json > /dev/null
# код возврата 0 — валидный JSON
#основы
@zen_of_python