JSON互換エンコーダー¶
Pydanticモデルのようなデータ型を、dict、listなどのJSON互換の型に変換する必要がある場合があります。
例えば、データベースに保存する必要がある場合などです。
そのために、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
🤓 その他のバージョンとバリアント
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(文字列として)は返しません。代わりに、値とサブ値がすべてJSON互換のPython標準データ構造(例:dict)を返します。
Note
jsonable_encoderは、FastAPIが内部でデータを変換するために実際に使用されています。しかし、他の多くのシナリオでも役立ちます。