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
🤓 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
に、datetime
をstr
に変換します。
呼び出した結果は、Pythonの標準のjson.dumps()
でエンコードできるものです。
これはJSON形式のデータを含む大きなstr
を(文字列として)返しません。JSONと互換性のある値とサブの値を持つPython標準のデータ構造(例:dict
)を返します。
備考
jsonable_encoder
は実際には FastAPI が内部的にデータを変換するために使用します。しかしこれは他の多くのシナリオで有用です。