Python
Как преобразовать словарь в JSON в Python
Словарь Python часто нужно сохранить в файл, передать в API, вывести в читаемом виде или загрузить обратно. Для этого используют модуль json
Главная пара команд: json.dumps() превращает объект в строку, json.loads() читает строку обратно. Для файлов используют dump() и load()
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Словарь в JSON-строку
import json
user = {"name": "Анна", "city": "Казань", "age": 28}
text = json.dumps(user, ensure_ascii=False)
print(text)
ensure_ascii=False нужен, чтобы русские буквы остались читаемыми, а не превратились в escape-последовательности
Красивый вывод через indent
Для чтения глазами удобно добавить отступы
import json
user = {"name": "Анна", "skills": ["Python", "SQL"]}
print(json.dumps(user, ensure_ascii=False, indent=2))
Такой формат полезен для конфигов, отладочных файлов и ручной проверки результата
Запись словаря в файл
import json
from pathlib import Path
data = {"theme": "dark", "limit": 20}
path = Path("settings.json")
with path.open("w", encoding="utf-8") as file:
json.dump(data, file, ensure_ascii=False, indent=2)
Используйте encoding="utf-8", чтобы не получить проблемы с русским текстом
Чтение JSON обратно
import json
from pathlib import Path
path = Path("settings.json")
with path.open("r", encoding="utf-8") as file:
data = json.load(file)
print(data["theme"])
После чтения вы снова работаете со словарем Python
Что нельзя сериализовать напрямую
JSON понимает строки, числа, списки, словари, True, False и None. Но не понимает даты, множества, объекты классов и функции без дополнительной обработки
import json
from datetime import date
data = {"today": str(date.today())}
print(json.dumps(data, ensure_ascii=False))
Для даты в простом случае достаточно превратить значение в строку
Русские буквы и читаемый JSON
Для русского текста почти всегда нужен ensure_ascii=False, иначе буквы превратятся в escape-последовательности
import json
user = {"name": "Анна", "city": "Казань"}
text = json.dumps(user, ensure_ascii=False, indent=2)
print(text)
indent=2 делает JSON удобным для чтения человеком. Для передачи между программами отступы не обязательны, но для учебных файлов они помогают увидеть структуру
Сохранить и прочитать обратно
import json
from pathlib import Path
path = Path("user.json")
user = {"name": "Анна", "skills": ["python", "sql"]}
path.write_text(json.dumps(user, ensure_ascii=False, indent=2), encoding="utf-8")
loaded = json.loads(path.read_text(encoding="utf-8"))
print(loaded["skills"])
После сохранения откройте файл глазами. Это простой способ проверить, что русские буквы, списки и вложенные поля сохранились так, как ожидалось
Что делать с датами и множествами
JSON понимает строки, числа, списки, словари, true, false и null. Даты, множества и собственные объекты нужно заранее превращать в простые типы
from datetime import date
import json
data = {"created_at": date.today().isoformat(), "tags": list({"python", "json"})}
print(json.dumps(data, ensure_ascii=False))
Частые ошибки
Путать dumps и dump
dumps() возвращает строку. dump() записывает в файл
Забывать ensure_ascii=False
Без этого русский текст может стать неудобным для чтения человеком
Пытаться сохранить неподдерживаемый объект
Если в данных есть дата, set или объект класса, сначала преобразуйте их в строки, списки или обычные словари
Практика
Создайте словарь настроек приложения, сохраните его в settings.json, откройте файл глазами, затем прочитайте его обратно и измените одно значение
Часто задаваемые вопросы
Чем JSON отличается от словаря Python?
Словарь — объект внутри Python. JSON — текстовый формат обмена данными, который можно сохранить или передать
Как сохранить русские буквы нормально?
Передайте ensure_ascii=False и открывайте файл с encoding="utf-8"
Можно ли сохранить список словарей?
Да. JSON отлично подходит для списка объектов, если внутри только поддерживаемые типы данных
Проверка JSON перед сохранением
Перед записью в файл убедитесь, что внутри словаря только простые типы: строки, числа, списки, словари, True, False, None. Даты, множества и собственные объекты нужно заранее преобразовать
import json
from datetime import date
data = {
"created_at": date.today().isoformat(),
"tags": list({"python", "json"}),
}
text = json.dumps(data, ensure_ascii=False, indent=2)
print(text)
Чтение с защитой от пустого файла
import json
from pathlib import Path
path = Path("settings.json")
if path.exists() and path.read_text(encoding="utf-8").strip():
settings = json.loads(path.read_text(encoding="utf-8"))
else:
settings = {}
print(settings)
Такой вариант полезен в маленьких скриптах, где файл настроек может появиться не сразу