22_JSON兼容编码器

22_JSON兼容编码器

在某些情况下我们可能需要将一种数据类型(如,Pydantic的model)转换成与JSON相兼容的类型(如 dict、list 等)。

例如,你想将它存放在数据库中。

FastAPI对此提供了一个jsonable_encoder()函数。


1. 使用jsonable_encoder

假设我们有一个数据库fake_db, 它只接收与JSON兼容的数据。比如,它不接收datetime对象,因为它不是JSON兼容的数据类型。

因此,一个datetime对象必须要被转换为对应ISO 格式时间数据的str类型对象。

同样的,这个数据库也不接收 Pydantic model类型(该类型对象带有属性),只能接收字典数据。

我们可以使用jsonable_encoder方法对其进行转换。

它接收类似 Pydantic model 的对象,返回一个与JSON兼容的版本:

# python 3.10
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)  # 转换item
    fake_db[id] = json_compatible_item_data

以上代码中,Pydantic model 对象会被转换为一个 dictdatetime对象会被转换为str

调用它的结果后就可以使用Python标准的json.dumps()方法对其进行编码了。

该方法不会返回一个包含JSON格式(str格式)数据的长str。而是返回一个Python标准的数据结构(如dict),其中的值和子值都和JSON兼容。

注意:

jsonable_encoder()实际上是FastAPI内部用来转换数据的。不过在其他一些场景中也很有用。

你可能感兴趣的:(FastAPI,fastapi,python,web,ASGI,json)