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.