Как исправить ошибку "TypeError: Объект типа datetime нельзя сериализовать в JSON"?

Каким образом можно настроить класс FastApi для сериализации/десериализации объектов с полями, содержащими дату/время, с помощью настройки пользовательского класса? Можно ли добавить функционал cls=DateTimeEncoder для json.dumps и избежать ошибок при отправке таких объектов в FastApi? Благодарю за помощь заранее.
  • 25 июля 2024 г. 13:23
Ответы на вопрос 2
Для исправления ошибки "TypeError: Объект типа datetime нельзя сериализовать в JSON" и настройки класса FastApi для сериализации/десериализации объектов с полями, содержащими дату/время, можно создать пользовательский класс, который будет обрабатывать преобразование даты/времени в строку при сериализации в JSON и обратно при десериализации.

Пример пользователяского класса для сериализации/десериализации объектов с полями даты/времени:

```python
from datetime import datetime
import json

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        return json.JSONEncoder.default(self, obj)

# Пример использования класса DateTimeEncoder
data = {
    'name': 'John',
    'birth_date': datetime(1990, 5, 15)
}
json_data = json.dumps(data, cls=DateTimeEncoder)
print(json_data)

# Для десериализации можно использовать стандартную функцию json.loads
```

Чтобы настроить FastApi для использования пользовательского класса при сериализации/десериализации объектов с датой/временем, можно применить его в методах API, где требуется обработка данных, содержащих даты/время. Например:

```python
from fastapi import FastAPI
from datetime import datetime
from typing import Dict
import json

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        return json.JSONEncoder.default(self, obj)

app = FastAPI()

@app.post("/data")
async def create_data(data: Dict[str, datetime]):
    json_data = json.dumps(data, cls=DateTimeEncoder)
    return json_data
```

Таким образом, вы можете добавить функционал cls=DateTimeEncoder для json.dumps и избежать ошибок при отправке объектов с полями даты/времени в FastApi.
открываем гугл, пишем заголовок вопроса, дописываем fastapi, в итоге получаем https://fastapi.tiangolo.com/tutorial/encoder/
Похожие вопросы