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.