コンテンツへスキップ

JSON互換エンコーダー

Pydanticモデルのようなデータ型をJSONと互換性のあるもの(dictlistなど)に変換する必要がある場合があります。

例えば、データベースに保存する必要がある場合などです。

そのために、FastAPIjsonable_encoder()関数を提供しています。

jsonable_encoder の使用

JSON互換データのみを受け取るデータベースfake_dbがあると想像してください。

例えば、JSONと互換性のないdatetimeオブジェクトは受け取りません。

したがって、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に、datetimestrに変換します。

これを呼び出した結果は、Python標準のjson.dumps()でエンコードできるものです。

JSON形式のデータ(文字列として)を含む大きなstrを返すわけではありません。Python標準のデータ構造(例:dict)を返し、その中にJSONと互換性のある値とサブ値が含まれています。

jsonable_encoderは、実際にはFastAPIによってデータを変換するために内部的に使用されています。しかし、他の多くのシナリオでも役立ちます。