JSON-kompatibler Encoder¶
Es gibt Fälle, da möchten Sie einen Datentyp (etwa ein Pydantic-Modell) in etwas konvertieren, das kompatibel mit JSON ist (etwa ein dict
, eine list
e, usw.).
Zum Beispiel, wenn Sie es in einer Datenbank speichern möchten.
Dafür bietet FastAPI eine Funktion jsonable_encoder()
.
jsonable_encoder
verwenden¶
Stellen wir uns vor, Sie haben eine Datenbank fake_db
, die nur JSON-kompatible Daten entgegennimmt.
Sie akzeptiert zum Beispiel keine datetime
-Objekte, da die nicht kompatibel mit JSON sind.
Ein datetime
-Objekt müsste also in einen str
umgewandelt werden, der die Daten im ISO-Format enthält.
Genauso würde die Datenbank kein Pydantic-Modell (ein Objekt mit Attributen) akzeptieren, sondern nur ein dict
.
Sie können für diese Fälle jsonable_encoder
verwenden.
Es nimmt ein Objekt entgegen, wie etwa ein Pydantic-Modell, und gibt eine JSON-kompatible Version zurück:
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
In diesem Beispiel wird das Pydantic-Modell in ein dict
, und das datetime
-Objekt in ein str
konvertiert.
Das Resultat dieses Aufrufs ist etwas, das mit Pythons Standard-json.dumps()
kodiert werden kann.
Es wird also kein großer str
zurückgegeben, der die Daten im JSON-Format (als String) enthält. Es wird eine Python-Standarddatenstruktur (z. B. ein dict
) zurückgegeben, mit Werten und Unterwerten, die alle mit JSON kompatibel sind.
"Hinweis"
jsonable_encoder
wird tatsächlich von FastAPI intern verwendet, um Daten zu konvertieren. Aber es ist in vielen anderen Szenarien hilfreich.