Python WindowsLinuxmacOSPython 3

Python: Как проверить причину ошибки сериализации объектов в JSON

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Ошибка TypeError: Object of type ... is not JSON serializable означает, что Python пытается передать в стандартный JSON неподдерживаемый объект, например datetime, set, Decimal или экземпляр собственного класса.

В этой статье
  1. Что произошло и когда проявляется ошибка
  2. Причины и диагностические признаки
  3. Подробная пошаговая диагностика и исправление
  4. Как проверить, что проблема устранена
  5. Если исправление не помогло

#Что произошло и когда проявляется ошибка

Ошибка TypeError: Object of type ... is not JSON serializable означает, что Python пытается передать в стандартный JSON неподдерживаемый объект, например datetime, set, Decimal или экземпляр собственного класса.

#Причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
В словаре встречается datetime или DecimalСтандартная библиотека не знает, в каком виде сохранять эти типы.TypeError называет datetime или DecimalЯвно выбрать строку ISO 8601 или представление числа по контракту.
Собственные объекты помещены в JSONЭкземпляр не является базовым JSON-типом.TypeError называет класс приложенияЯвно извлечь разрешённые поля в dict.
Используется неподходящий контейнерМножества и байты требуют соглашения о преобразовании.TypeError для set, bytes или tuple особого видаОпределить формат и проверить обратимость.

#Подробная пошаговая диагностика и исправление

  1. 1. Получите тип и место возникновения ошибкиЗапустите сериализацию тестового объекта с json.dumps, сохраните последнюю строку TypeError и соответствующее место в коде. Не заменяйте исключение default=str без согласованного формата: такая строка может оказаться бесполезной при чтении, а данные потеряют тип.
  1. 2. Найдите неподдерживаемый объектВыведите имена типов только на тестовой копии структуры, без приватных значений. Сначала проверьте верхние поля словаря и массивы внутри них. При глубокой структуре используйте ограниченный рекурсивный диагностический обход либо явный список проблемных полей.
  2. Пример кода по теме
    Python
    Образец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
    import json
    from datetime import datetime
    obj = {"created": datetime.now()}
    try:
        json.dumps(obj)
    except TypeError as exc:
        print(type(obj["created"]).__name__, exc)
  1. 3. Для даты выберите строковое представлениеЕсли получатель ожидает ISO 8601, сохраняйте datetime через isoformat(); для хранения момента времени используйте aware-дату с явным смещением или UTC. При чтении обратно json.loads даст строку — потребитель должен сознательно восстановить тип по схеме.
  2. Пример кода по теме
    Python
    Образец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
    from datetime import datetime, timezone
    import json
    obj = {"created": datetime.now(timezone.utc).isoformat()}
    print(json.dumps(obj, ensure_ascii=False))
  1. 4. Для собственных классов сериализуйте разрешённые поляСоставьте обычный словарь с безопасным перечнем полей; не используйте vars(obj) как универсальную выгрузку — в объекте могут быть внутренние поля и секреты. Для set заранее определите порядок: если нужен стабильный список однородных сравнимых значений, можно использовать sorted, но для смешанных типов потребуется другое правило.
  2. Пример кода по теме
    Python
    Образец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
    from dataclasses import dataclass, asdict
    import json
    @dataclass
    class UserView:
        username: str
        active: bool
    print(json.dumps(asdict(UserView("Анна", True)), ensure_ascii=False))
  1. 5. Проверьте обратное чтение и схемуЗапишите JSON в новый файл, прочитайте его через json.loads и сравните ожидаемые поля, типы и значения. Для денег лучше заранее выбрать точную строку десятичного числа либо согласованное целое в минимальных единицах, а не бездумное преобразование Decimal в float.
  1. 6. Отдельно обработайте циклы и NaNЕсли ошибка не исчезла, проверьте циклические ссылки (ValueError: Circular reference detected) и значения NaN/бесконечность. Для строгого JSON задайте allow_nan=False, а не оставляйте невалидные для многих систем литералы NaN и Infinity.

#Как проверить, что проблема устранена

Результат содержит только разрешённые JSON-типы; повторное чтение проходит, а значения после преобразований соответствуют документированному контракту.

#Если исправление не помогло

Нельзя безусловно сериализовать пароли, токены, объекты соединений и внутренние состояния. При отказе от преобразования поля явно сообщайте об этом, не пропускайте его молча.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.