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 编码过程,以适应我们的需求。