JSON 相容編碼器¶
在某些情況下,您可能需要將資料類型(例如 Pydantic 模型)轉換為與 JSON 相容的類型(例如 dict
、list
等)。
例如,如果您需要將其儲存在資料庫中。
為此,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 內部用於轉換資料。但它在許多其他情況下也很有用。