Python: как прочитать и записать JSON-файл

Категория: Python · Язык: Python · Обновлено:

Чтобы прочитать JSON-файл в Python, откройте его и передайте в json.load(f). Записывает данные json.dump(data, f, ensure_ascii=False, indent=2). Всегда указывайте encoding="utf-8", иначе кириллица может испортиться на Windows.

Записать данные в файл

Python
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 включает отступы для чтения человеком.

Прочитать файл

Python
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:

Python
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.

Обработка ошибок

Python
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:

Python
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"]}

Красивый вывод и сортировка ключей

Python
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).