JSON互換エンコーダー¶
データ型(Pydanticモデルなど)をJSONと互換性のあるもの(dict
、list
など)に変換する必要がある場合があります。
たとえば、データベースに保存する必要がある場合などです。
そのため、FastAPIはjsonable_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
に、datetime
をstr
に変換します。
これを呼び出した結果は、Python標準のjson.dumps()
でエンコードできるものです。
JSON形式のデータを含む大きなstr
(文字列として)を返すわけではありません。JSONと互換性のある値とサブ値を持つPython標準のデータ構造(たとえば、dict
)を返します。
注記
jsonable_encoder
は、実際にはFastAPIが内部でデータを変換するために使用しています。しかし、他の多くのシナリオでも役立ちます。