Вопрос с собеседования · Python

Как работать с JSON в Python и что делать с датами и своими объектами?

JuniorВеб-фреймворки
Ещё спрашивают так:
  • Как сериализовать 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 хранит их точно

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования