Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
07 Июл 2023
2 мин
352

Решение проблемы «datetime.datetime не сериализуется в JSON в Python»

В программировании на Python часто возникают ситуации, когда нужно сериализовать объекты в формат JSON. Однако, стандартный модуль json не способен сериализовать

В программировании на Python часто возникают ситуации, когда нужно сериализовать объекты в формат JSON. Однако, стандартный модуль json не способен сериализовать все типы объектов. Одним из таких типов, который вызывает проблемы, является datetime.datetime.

Попытка сериализовать словарь, содержащий объект datetime, приведет к ошибке TypeError: datetime.datetime is not JSON serializable. Например:

import datetime
import json

sample = {}
sample['title'] = "String"
sample['somedate'] = datetime.datetime.now()

json.dumps(sample)

Этот код вызовет упомянутую выше ошибку. Проблема заключается в том, что JSON не имеет встроенного типа для даты и времени, поэтому datetime объекты не могут быть прямо сериализованы.

Существует несколько способов обойти эту проблему. Один из них — преобразовать объект datetime в строку перед сериализацией. Это можно сделать с помощью метода isoformat():

import datetime
import json

sample = {}
sample['title'] = "String"
sample['somedate'] = datetime.datetime.now().isoformat()

json.dumps(sample)

В этом случае json.dumps() успешно сериализует словарь, и somedate теперь представлен в формате ISO 8601.

Другой способ — использование параметра default в функции json.dumps(). Этот параметр принимает функцию, которая будет вызываться для объектов, которые не могут быть сериализованы. Можно использовать его для преобразования datetime объектов в строки:

import datetime
import json

def datetime_handler(x):
    if isinstance(x, datetime.datetime):
        return x.isoformat()
    raise TypeError("Unknown type")

sample = {}
sample['title'] = "String"
sample['somedate'] = datetime.datetime.now()

json.dumps(sample, default=datetime_handler)

В этом примере, если json.dumps() столкнется с объектом datetime, он будет преобразован в строку с помощью isoformat(). Если же будет встречен неизвестный тип, будет вызвано исключение TypeError.

Эти методы позволяют обойти проблему сериализации datetime объектов в JSON в Python.

Добавить комментарий