FastAPI 自定义 FastAPI 中的默认 JSON 编码器

FastAPI 自定义 FastAPI 中的默认 JSON 编码器

在本文中,我们将介绍如何在 FastAPI 中自定义默认的 JSON 编码器,以便更好地处理特定的数据类型和对象。

FastAPI 是一个基于异步的 Python Web 框架,它提供了强大的类型提示、快速的性能和易于使用的 API 设计。在 FastAPI 中,使用jsonable_encoder函数将对象编码为 JSON 字符串。该函数默认使用json.JSONEncoder作为编码器。但是,有时我们可能需要自定义编码器来处理一些自定义类型或复杂对象。

阅读更多:FastAPI 教程

自定义 JSON 编码器

要自定义默认的 JSON 编码器,我们需要创建一个继承自json.JSONEncoder的子类,并重写default方法,以处理我们希望特殊处理的类型。这个方法会在遇到无法序列化的对象时被调用。

from json import JSONEncoder

class MyJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, MyCustomType):
            return obj.to_json()
        return super().default(obj)

在上面的示例中,我们创建了一个MyJSONEncoder类,并重写了default方法。如果对象的类型是MyCustomType,我们调用了它的自定义方法to_json()来获取可以被序列化的 JSON 对象。否则,我们调用了父类的default方法,以处理其他类型的对象。

在 FastAPI 中使用自定义 JSON 编码器

要在 FastAPI 中使用我们自定义的 JSON 编码器,我们需要通过创建一个FastAPI的子类,并在子类的构造函数中指定default参数为我们的自定义编码器。

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder

app = FastAPI(json_encoder=MyJSONEncoder)

在上面的示例中,我们创建了一个FastAPI的子类app,并通过json_encoder参数指定了我们的自定义 JSON 编码器MyJSONEncoder

现在,当我们使用jsonable_encoder函数将对象编码为 JSON 字符串时,FastAPI 将使用我们自定义的编码器。

示例

让我们通过一个示例来更好地理解如何自定义默认的 JSON 编码器。

假设我们有一个名为Person的自定义类型,表示一个人的信息,包含姓名和年龄。

class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def to_json(self):
        return {
            "name": self.name,
            "age": self.age
        }

然后,让我们在我们的 FastAPI 应用程序中使用这个自定义类型,并将其转换为 JSON 字符串。

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder

class MyJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Person):
            return obj.to_json()
        return super().default(obj)

app = FastAPI(json_encoder=MyJSONEncoder)

@app.get("/person")
def get_person():
    person = Person(name="Alice", age=25)
    return jsonable_encoder(person)

在上面的示例中,我们创建了一个名为Person的自定义类型,并在MyJSONEncoder中进行了处理。然后,我们在路由函数get_person中创建了一个Person对象,并使用jsonable_encoder函数将其编码为 JSON 字符串。

当我们访问/person路由时,我们将得到如下 JSON 响应:

{
    "name": "Alice",
    "age": 25
}

这是因为我们在自定义的 JSON 编码器中使用了to_json()方法来处理Person对象。

总结

在本文中,我们介绍了如何在 FastAPI 中自定义默认的 JSON 编码器。通过创建一个继承自json.JSONEncoder的子类,并重写其中的default方法,我们可以处理特定类型的对象和数据。在 FastAPI 应用程序中,我们可以通过在 FastAPI 的子类中指定json_encoder参数来使用自定义编码器。这样,我们可以更好地控制 JSON 编码过程,以适应我们的需求。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程