如何使用 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Python 中如何将类对象序列化为JSON?

无法将当前 JSON 数组(例如 [1,2,3])反序列化为具有复杂和嵌套对象的类型

Flask 数据json序列化(四)

如何使用 Json.NET 将 XML 序列化为 JSON 对象

如何将属性序列化为 json 对象?

如何使用 Jackson 将原始 JSON 反序列化为 Java 对象