Перейти к содержанию

JSON кодировщик

В некоторых случаях может потребоваться преобразование типа данных (например, Pydantic-модели) в тип, совместимый с JSON (например, dict, list и т.д.).

Например, если необходимо хранить его в базе данных.

Для этого FastAPI предоставляет функцию jsonable_encoder().

Использование jsonable_encoder

Представим, что у вас есть база данных fake_db, которая принимает только JSON-совместимые данные.

Например, он не принимает объекты datetime, так как они не совместимы с JSON.

Так, объект datetime должен быть преобразован в str в ISO формате.

Точно так же эта база данных не получит 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().

Функция не возвращает большой str, содержащий данные в формате JSON (в виде строки). Она возвращает стандартную структуру данных Python (например, dict) со значениями и подзначениями, которые совместимы с JSON.

Технические детали

jsonable_encoder фактически используется FastAPI внутри системы для преобразования данных. Однако он полезен и во многих других сценариях.