我在Flask应用程序中一直使用的方法是将类实例序列化为JSON响应。
参考Github项目
from json import JSONEncoder
import json
from typing import List
class ResponseEncoder(JSONEncoder):
def default(self, o):
return o.__dict__
class ListResponse:
def __init__(self, data: List):
self.data = data
self.count = len(data)
class A:
def __init__(self, message: str):
self.message = message
class B:
def __init__(self, record: A):
self.record = record
class C:
def __init__(self, data: B):
self.data = data
现在创建 A、B、C 的实例,然后进行编码。
data_a = A('Test Data')
data_b = B(data_a)
data_c = C(data_b)
response = ResponseEncoder().encode(data_c)
json_response = json.loads(response)
输出
{
"data": {
"record": {
"message": "Test Data"
}
}
}
对于列表类型的响应
records = ['One', 'Two', 'Three']
list_response = ListResponse(records)
response = ResponseEncoder().encode(list_response)
json_response = json.loads(response)
输出
{
"data": [
"One",
"Two",
"Three"
],
"count": 3
}
s = json.dumps(obj, default=lambda x: x.__dict__)
将对象的实例变量(self.value1
,self.value2
,...)进行序列化。这是最简单和最直接的方法,它可以序列化嵌套的对象结构。当任何给定对象不是直接可序列化时,将调用default
函数。你也可以看看我下面的答案。我发现流行的答案过于复杂,可能在很长时间以前是正确的。 - codeman48testclass
没有__init__()
方法,因此所有实例将共享在类语句中定义的两个类属性 (value1
和value2
)。你明白类和实例之间的区别吗? - martineau