跳至內容

JSON 相容編碼器

在某些情況下,您可能需要將資料類型(例如 Pydantic 模型)轉換為與 JSON 相容的類型(例如 dictlist 等)。

例如,如果您需要將其儲存在資料庫中。

為此,FastAPI 提供了一個 jsonable_encoder() 函式。

使用 jsonable_encoder

假設您有一個名為 fake_db 的資料庫,它只接收與 JSON 相容的資料。

例如,它不接收 datetime 物件,因為它們與 JSON 不相容。

因此,datetime 物件必須轉換為包含 ISO 格式 資料的 str

同樣地,這個資料庫也不會接收 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() 編碼的內容。

它不會返回一個包含 JSON 格式資料(作為字串)的大型 str。它返回一個 Python 標準資料結構(例如 dict),其中的值和子值都與 JSON 相容。

注意事項

jsonable_encoder 實際上是由 FastAPI 內部用於轉換資料。但它在許多其他情況下也很有用。