コンテンツにスキップ

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(文字列として)を返すわけではありません。JSONと互換性のある値とサブ値を持つPython標準のデータ構造(たとえば、dict)を返します。

注記

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