JSON 相容編碼器¶
在某些情況下,你可能需要將某種資料型別(例如 Pydantic 模型)轉換為與 JSON 相容的類型(例如 dict、list 等)。
例如,當你需要把它儲存在資料庫中。
為此,FastAPI 提供了 jsonable_encoder() 函式。
使用 jsonable_encoder¶
想像你有一個只接受與 JSON 相容資料的資料庫 fake_db。
例如,它不接受 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
在此範例中,它會把 Pydantic 模型轉成 dict,並將 datetime 轉成 str。
呼叫後的結果可以用 Python 標準的 json.dumps() 進行編碼。
它不會回傳一個包含 JSON 內容的大型 str(字串)。它會回傳 Python 標準的資料結構(例如 dict),其中的值與子值都與 JSON 相容。
Note
事實上,jsonable_encoder 在 FastAPI 內部也被用來轉換資料。不過在許多其他情境中它同樣實用。