Ir para o conteúdo

Codificador Compatível com JSON

Existem alguns casos em que você pode precisar converter um tipo de dados (como um modelo Pydantic) para algo compatível com JSON (como um dict, list, etc).

Por exemplo, se você precisar armazená-lo em um banco de dados.

Para isso, FastAPI fornece uma função jsonable_encoder().

Usando a função jsonable_encoder

Vamos imaginar que você tenha um banco de dados fake_db que recebe apenas dados compatíveis com JSON.

Por exemplo, ele não recebe objetos datetime, pois estes objetos não são compatíveis com JSON.

Então, um objeto datetime teria que ser convertido em um str contendo os dados no formato ISO.

Da mesma forma, este banco de dados não receberia um modelo Pydantic (um objeto com atributos), apenas um dict.

Você pode usar a função jsonable_encoder para resolver isso.

A função recebe um objeto, como um modelo Pydantic e retorna uma versão compatível com 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

Neste exemplo, ele converteria o modelo Pydantic em um dict, e o datetime em um str.

O resultado de chamar a função é algo que pode ser codificado com o padrão do Python json.dumps().

A função não retorna um grande str contendo os dados no formato JSON (como uma string). Mas sim, retorna uma estrutura de dados padrão do Python (por exemplo, um dict) com valores e subvalores compatíveis com JSON.

Nota

jsonable_encoder é realmente usado pelo FastAPI internamente para converter dados. Mas também é útil em muitos outros cenários.