如何使用 Flask 将复杂对象序列化为 JSON [重复]
Posted
技术标签:
【中文标题】如何使用 Flask 将复杂对象序列化为 JSON [重复]【英文标题】:How to serialize complex objects to JSON with Flask [duplicate] 【发布时间】:2018-07-08 16:53:19 【问题描述】:我是 Flask 的新手,在尝试返回包含另一个对象实例作为字段的对象时遇到了一些问题,如下所示:
class Park(object):
park_id = 0
address = ""
services = []
position = None
def __init__(self, park_id, address, services, latitude, longitude):
self.park_id = park_id
self.address = address
self.services = services
self.position = Point(latitude, longitude)
Point 类如下:
class Point(object):
latitude = None
longitude = None
def __init__(self, latitude, longitude):
self.latitude = latitude
self.longitude = longitude
当我尝试返回 Park 实例时
@app.route('/')
def test():
park = Park(....)
return jsonify(park])
我收到此错误:TypeError: Object of type 'Park' is not JSON serializable
。
【问题讨论】:
我认为您首先必须考虑如何将Point
实例转换为JSON 对象,例如"latitude": 123.4, "longitude": 567.8
?
【参考方案1】:
Python 的默认 json 模块默认不序列化复杂对象。
你可以使用像jsonpickle这样的库;或者只是在您的 Park
类中实现一个 to_dict
方法,将您的对象转换为字典,这样您就可以调用 jsonify(park.to_dict())
。
【讨论】:
【参考方案2】:我认为 Willem 是对的,因为您首先需要将您的类转换为类似 JSON 的对象,例如 dict
。如果您只想转换 Point
类的属性,可以使用 __dict__
特殊属性或 vars()
内置属性。
以下是使用vars
进行转换的快速函数。请注意,我已经对其进行了硬编码以检查Point
类,但这可以很容易地扩展为更通用。这也只检查一层深度,但可以根据需要写成递归的深度。您还可以将此函数转换为 Park
类本身的方法,以将所有内容放在一起/更加面向对象。
def convert_park_to_dict(park):
park_dict =
for attr in vars(park):
attr_value = getattr(park, attr)
if isinstance(attr_value, Point):
point_dict = vars(attr_value)
park_dict[attr] = point_dict
else:
park_dict[attr] = attr_value
return park_dict
@app.route('/')
def test():
park = Park(1, 'my_house', ['swings', 'shop'], 50, 60)
park_dict = convert_park_to_dict(park)
return jsonify(park_dict)
):
阅读更多关于__dict__
here的信息。
【讨论】:
以上是关于如何使用 Flask 将复杂对象序列化为 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章
无法将当前 JSON 数组(例如 [1,2,3])反序列化为具有复杂和嵌套对象的类型