Кодировщик, совместимый с 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
🤓 Другие версии и варианты
from datetime import datetime
from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
fake_db = {}
class Item(BaseModel):
title: str
timestamp: datetime
description: Union[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/