Как работать с JSON в Python и что делать с датами и своими объектами?
- Как сериализовать datetime в JSON?
- Чем json.dump отличается от json.dumps?
json.dumps(obj) превращает объект в строку, json.loads(s) — строку в объект; dump/load — то же для файлов. Поддерживаются только dict, list, str, int, float, bool, None; кортеж станет списком, ключи словаря — строками. datetime, Decimal, UUID, свои классы стандартный модуль не знает — нужен параметр default с функцией преобразования или Pydantic, который умеет это из коробки.
- ensure_ascii=False — кириллица без экранирования А
- Даты передают в формате ISO 8601: dt.isoformat()
- Деньги — строкой или целым числом копеек, а не float
А ещё Невалидный JSON при loads бросает json.JSONDecodeError
Подробно
Пример с датой:
import json
from datetime import datetime
def default(o):
if isinstance(o, datetime):
return o.isoformat()
raise TypeError(f"не умею сериализовать {type(o)}")
json.dumps({"at": datetime.now(), "name": "Анна"},
default=default, ensure_ascii=False)
Обратно даты сами не восстанавливаются — их разбирают явно (datetime.fromisoformat) или описывают схемой Pydantic.
Точность: float в JSON теряет точность для денег — 0.1 + 0.2 != 0.3; суммы хранят в копейках или Decimal строкой.
Что хотят услышать
- dumps/loads и dump/load.
- Поддерживаемые типы.
- default для дат и своих объектов, ISO 8601.
- ensure_ascii и деньги.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗json.dumps сам сериализует datetime и Decimal, default не нужен
- ✓dumps/loads — для строк, dump/load — для файлов; даты — через default в ISO 8601
- ✗Кортеж после dumps и loads остаётся кортежем, а set — множеством
- ✗Деньги удобнее передавать как float — JSON хранит их точно
Разбор темы
- Веб на Python — WSGI и ASGI, FastAPI, HTTP-клиенты, JSON, Django ORM
Чем WSGI отличается от ASGI, простой API на FastAPI и внедрение зависимостей, requests и httpx с таймаутами, JSON с датами и деньгами, N+1 в Django.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.