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