Кодировщик, совместимый с JSON
В некоторых случаях может потребоваться преобразовать тип данных (например, модель Pydantic) во что-то совместимое с JSON (например, dict, list и т. д.).
Например, если нужно сохранить его в базе данных.
Для этого FastAPI предоставляет функцию jsonable_encoder().
Использование jsonable_encoder
Представим, что у вас есть база данных fake_db, которая принимает только данные, совместимые с JSON.
Например, она не принимает объекты datetime, поскольку они несовместимы с JSON.
Поэтому объект datetime нужно было бы преобразовать в str, содержащий данные в формате ISO.
Точно так же эта база данных не приняла бы модель Pydantic (объект с атрибутами), а только dict.
Для этого можно использовать jsonable_encoder.
Функция принимает объект, например модель Pydantic, и возвращает версию, совместимую с JSON:
from datetime import datetime
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
fake_db = {}
class Item(BaseModel):
title: str
timestamp: datetime
description: str | None = None
app = FastAPI()
@app.put("/items/{id}")
def update_item(id: str, item: Item):
json_compatible_item_data = jsonable_encoder(item)
fake_db[id] = json_compatible_item_data
В этом примере она преобразует модель Pydantic в dict, а datetime — в str.
Результат её вызова можно закодировать с помощью стандартной функции Python json.dumps().
Функция не возвращает большую str с данными в формате JSON (в виде строки). Она возвращает стандартную структуру данных Python (например, dict) со значениями и вложенными значениями, совместимыми с JSON.
Примечание
jsonable_encoder фактически используется FastAPI внутри для преобразования данных. Но она полезна и во многих других случаях.
© 2018 Sebastián Ramírez
Licensed under the MIT License.
https://fastapi.tiangolo.com/tutorial/encoder/