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)

Такой вариант полезен в маленьких скриптах, где файл настроек может появиться не сразу

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x