👨💻
Как работать с JSON в Python: сохраняем, читаем и автоматизируем!JSON — это лёгкий формат обмена данными, который читается человеком и отлично понимается компьютером. Несмотря на название (JavaScript Object Notation), он полностью независим от языка — и в Python работать с ним проще простого.
😰 В Python всё делает встроенный модуль json — никаких дополнительных библиотек не нужно.
Что к чему*
json.dump(obj, fp, ...) — сериализует obj сразу в файл/поток (fp), возвращает
None.
*
json.dumps(obj, ...) — сериализует в строку (удобно отправлять по сети/логировать).
*
json.load(fp, ...) — читает из файла/потока и возвращает Python‑объект.
*
json.loads(s, ...) — парсит из строки и возвращает Python‑объект.
Сохранение JSON (и разница dump/dumps)import json
data = {
"name": "John",
"salary": 1499.9,
"is_real": False,
"titles": ["The Unknown", "Anonymous"]
}
# dump: сразу в файл
with open("data1.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2) # возвращает None
# dumps: получаем строку (например, чтобы отправить в API)
payload = json.dumps(data, indent=2)
print(type(payload)) # <class 'str'>
#
ensure_ascii: как сохранить не-ASCII символы без \uXXXXПо умолчанию JSON экранирует всё не-ASCII:ru = {"first_name": "Алиса", "city": "München"}
print(json.dumps(ru))
# {"first_name": "\u0410\u043b\u0438\u0441\u0430", "city": "M\u00fcnchen"}
print(json.dumps(ru, ensure_ascii=False))
# {"first_name": "Алиса", "city": "München"}В файл — обязательно с кодировкой:with open("ru.json", "w", encoding="utf-8") as f:
json.dump(ru, f, ensure_ascii=False, indent=2)>
ensure_ascii работает и в
dump, и в
dumps. Для чтения (
load/loads) не нужен.
Полезные опции:*
indent=2 — красиво форматирует.
*
separators=(",", ":") — компактный вывод (без пробелов).
*
sort_keys=True — ключи по алфавиту (удобно для диффов).
Загрузка JSON (и разница load/loads)import json
# load: из файла
with open("data1.json", "r", encoding="utf-8") as f:
obj = json.load(f)
# loads: из строки
s = '{"ok": true, "n": 3}'
obj2 = json.loads(s)
Мини‑обработка ошибок:try:
json.loads('{"broken": }')
except json.JSONDecodeError as e:
print(f"Ошибка в строке {e.lineno}, столбце {e.colno}: {e.msg}")
Маленькая практика: забрали данные и сохранили красивоimport json, requests
users = requests.get("https://jsonplaceholder.typicode.com/users").json()
# всё в один файл
with open("users.json", "w", encoding="utf-8") as f:
json.dump(users, f, indent=2, ensure_ascii=False)
# каждый пользователь — в отдельный файл
for u in users:
with open(f"user_{u['id']}.json", "w", encoding="utf-8") as f:
json.dump(u, f, indent=2, ensure_ascii=False)
Важно помнить*
datetime,
Decimal, свои классы —
не сериализуются “из коробки”. Нужен
default= или предварительная конвертация.
* Числа с плавающей точкой — это
float (осторожно с точностью, если нужны деньги — храните как строки/копейки).
JSON — это must-have навык для любого Python-разработчика: от парсинга и API-запросов до конфигураций и хранения данных.
👍 Сохраняй шпаргалку, пригодится!
#doc #python #cheatsheet