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
を返すわけではありません。Python標準のデータ構造(例:dict
)を返し、その中にJSONと互換性のある値とサブ値が含まれています。
注
jsonable_encoder
は、実際にはFastAPIによってデータを変換するために内部的に使用されています。しかし、他の多くのシナリオでも役立ちます。