在某些情况下,您可能需要将数据类型(例如Pydantic模型)转换为与JSON兼容的数据(例如dict,list等)。
例如,如果您需要将其存储在数据库中。
为此,FastAPI提供了jsonable_encoder()函数。

使用jsonable_encoder

假设您有一个仅接收JSON兼容数据的数据库fake_db
例如,它不接收日期时间对象,因为它们与JSON不兼容。
因此,datetime对象必须转换为包含ISO格式数据的str。
同样,该数据库将不会接收Pydantic模型(具有属性的对象),而只会接收dict
您可以为此使用jsonable_encoder
它接收一个对象,如Pydantic模型,并返回JSON兼容版本:

  1. from datetime import datetime
  2. from fastapi import FastAPI
  3. from fastapi.encoders import jsonable_encoder
  4. from pydantic import BaseModel
  5. fake_db = {}
  6. class Item(BaseModel):
  7. title: str
  8. timestamp: datetime
  9. description: str = None
  10. app = FastAPI()
  11. @app.put("/items/{id}")
  12. def update_item(id: str, item: Item):
  13. json_compatible_item_data = jsonable_encoder(item)
  14. fake_db[id] = json_compatible_item_data

在此示例中,它将Pydantic模型转换为dict,并将日期时间转换为str
调用它的结果是可以用Python标准json.dumps()进行编码的东西。
它不会返回包含JSON格式的数据(作为字符串)的大str。它返回Python标准数据结构(例如dict),其值和子值都与JSON兼容。

:::tips FastAPI实际上在内部使用jsonable_encoder来转换数据。但这在许多其他情况下很有用. :::