Saltar a contenido

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.