Python: как прочитать и записать JSON-файл
Чтобы прочитать JSON-файл в Python, откройте его и передайте в json.load(f). Записывает данные json.dump(data, f, ensure_ascii=False, indent=2). Всегда указывайте encoding="utf-8", иначе кириллица может испортиться на Windows.
Записать данные в файл
import json
data = {"name": "Анна", "age": 31, "skills": ["python", "sql"], "active": True}
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)Параметр ensure_ascii=False сохраняет русские буквы как есть. Без него в файле появятся последовательности вроде Анна. Параметр indent=2 включает отступы для чтения человеком.
Прочитать файл
with open("user.json", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["name"]) # Анна
print(loaded["skills"][0]) # python
print(loaded == data) # TrueСтрока вместо файла
Функции loads и dumps работают со строками, а не с файлами. Это нужно при разборе ответа API:
text = '{"id": 7, "tags": ["a", "b"], "price": 9.5, "gift": null}'
obj = json.loads(text)
print(obj["tags"]) # ['a', 'b']
print(obj["gift"]) # None
print(json.dumps(obj, ensure_ascii=False)) # {"id": 7, "tags": ["a", "b"], "price": 9.5, "gift": null}Соответствие типов: true и false превращаются в True и False, null в None, объект в dict, массив в list.
Обработка ошибок
try:
json.loads("{'name': 'Анна'}") # одинарные кавычки в JSON недопустимы
except json.JSONDecodeError as error:
print(error.msg) # Expecting property name enclosed in double quotesОшибка JSONDecodeError содержит строку, столбец и позицию проблемы: error.lineno, error.colno, error.pos.
Даты и свои типы
Стандартный json не умеет сериализовать datetime, Decimal и множества. Передайте функцию в default:
from datetime import date
report = {"day": date(2026, 10, 25), "tags": {"b", "a"}}
def convert(value):
if isinstance(value, date):
return value.isoformat()
if isinstance(value, set):
return sorted(value)
raise TypeError(f"Нельзя сериализовать {type(value).__name__}")
print(json.dumps(report, default=convert)) # {"day": "2026-10-25", "tags": ["a", "b"]}Красивый вывод и сортировка ключей
print(json.dumps({"b": 1, "a": 2}, sort_keys=True)) # {"a": 2, "b": 1}
print(json.dumps([1, 2], separators=(",", ":"))) # [1,2]Частые вопросы
Как дописать данные в существующий JSON-файл?
JSON нельзя дописывать в конец, как обычный текст. Прочитайте файл, измените структуру в памяти и запишите целиком.
Почему вместо кириллицы в файле набор символов с обратной косой чертой?
Не указан ensure_ascii=False. Это не ошибка: такой файл читается корректно, но неудобен глазами.
Как читать большие файлы с JSON-объектами по одной строке?
Формат JSON Lines читают построчно: for line in f: obj = json.loads(line).