コンテンツにスキップ

JSON互換エンコーダ

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

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

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

jsonable_encoderの使用

JSON互換のデータのみを受信するデータベースfase_dbがあるとしましょう。

例えば、datetimeオブジェクトはJSONと互換性がないので、このデーターベースには受け取られません。

そのため、datetimeオブジェクトはISO形式のデータを含むstrに変換されなければなりません。

同様に、このデータベースはPydanticモデル(属性を持つオブジェクト)を受け取らず、dictだけを受け取ります。

そのためにjsonable_encoderを使用することができます。

Pydanticモデルのようなオブジェクトを受け取り、JSON互換版を返します:

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
🤓 Other versions and variants
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に、datetimestrに変換します。

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

これはJSON形式のデータを含む大きなstrを(文字列として)返しません。JSONと互換性のある値とサブの値を持つPython標準のデータ構造(例:dict)を返します。

備考

jsonable_encoderは実際には FastAPI が内部的にデータを変換するために使用します。しかしこれは他の多くのシナリオで有用です。