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内部用来转换数据的。不过在其他一些场景中也很有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了扩展 JSON 模块,使得 `json.dumps()` 方法可以自动识别编码器,您可以定义一个自定义的编码器类,并将其作为参数传递给 `json.dumps()` 方法。该编码器类必须是 `json.JSONEncoder` 的子类,并实现 `default()` 方法。在 `default()` 方法中,您可以检查对象的类型,并将其转换为 JSON 兼容的类型。 下面是一个示例代码,展示如何定义一个自定义编码器类,并将其用于 `json.dumps()` 方法: ```python import json import pandas as pd # 自定义编码器类 class DataFrameEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, pd.DataFrame): return obj.to_json(orient='split') return super().default(obj) # 定义 DataFrame df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) # 使用自定义编码器类转换为 JSON json_data = json.dumps(df, cls=DataFrameEncoder) print(json_data) ``` 在上面的代码中,我们定义了一个自定义编码器类 `DataFrameEncoder`,它是 `json.JSONEncoder` 的子类。在 `default()` 方法中,我们检查对象是否是 DataFrame,如果是,则使用 DataFrame 的 `to_json()` 方法将其转换为 JSON,并使用 `orient` 参数设置为 `'split'`。否则,我们将其传递给 `super().default()` 方法,该方法将对象转换为其默认的 JSON 兼容类型。 接下来,我们定义了一个 DataFrame,并使用 `json.dumps()` 方法将其转换为 JSON。在这里,我们将自定义编码器类 `DataFrameEncoder` 作为 `cls` 参数传递给 `json.dumps()` 方法。这样,`json.dumps()` 方法将自动使用我们的自定义编码器类进行编码。 这样,您就可以扩展 JSON 模块,使得 `json.dumps()` 方法可以自动识别编码器,并将 DataFrame 转换为 JSON

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值