JSON Compatible Encoder¶
Hay algunos casos en los que podrías necesitar convertir un tipo de dato (como un modelo de Pydantic) a algo compatible con JSON (como un dict, list, etc).
Por ejemplo, si necesitas almacenarlo en una base de datos.
Para eso, FastAPI proporciona una función jsonable_encoder().
Usando el jsonable_encoder¶
Imaginemos que tienes una base de datos fake_db que solo recibe datos compatibles con JSON.
Por ejemplo, no recibe objetos datetime, ya que no son compatibles con JSON.
Entonces, un objeto datetime tendría que ser convertido a un str que contenga los datos en formato ISO.
De la misma manera, esta base de datos no recibiría un modelo de Pydantic (un objeto con atributos), solo un dict.
Puedes usar jsonable_encoder para eso.
Recibe un objeto, como un modelo de Pydantic, y devuelve una versión compatible con 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
🤓 Other versions and variants
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
En este ejemplo, convertiría el modelo de Pydantic a un dict, y el datetime a un str.
El resultado de llamarlo es algo que puede ser codificado con la función estándar de Python json.dumps().
No devuelve un gran str que contenga los datos en formato JSON (como una cadena de texto). Devuelve una estructura de datos estándar de Python (por ejemplo, un dict) con valores y sub-valores que son todos compatibles con JSON.
Nota
jsonable_encoder es utilizado internamente por FastAPI para convertir datos. Pero es útil en muchos otros escenarios.