【问题标题】:How to serialize complex objects to JSON with Flask [duplicate]如何使用 Flask 将复杂对象序列化为 JSON [重复]
【发布时间】: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}

标签: python json flask


【解决方案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的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多