Flask jsonify:对象不可迭代

时间:2013-12-18 21:34:14

标签: python json flask

我的课程如下:

class Sound(SoundJsonSerializer):
    def __init__(self, name, length):
        self.name = name
        self.length = length

其中SoundJsonSerializer启用我的自定义JSONEncoder将此对象序列化为JSON:

{
    "name": "foobar",
    "length": 23.4
}

现在我希望我的一个请求完全响应上面的JSON。

@app.route('/sounds/<soundid>')
def get_sound(soundid):
    s = Sound("foobar", 23.4)
    return jsonify(s)

产生错误声明s不可迭代,这是真的。如何让方法返回我想要的JSON?

我知道我可以通过从我的Sound对象显式创建一个dict来做到这一点:

    return jsonify({"name": s.name, "length": s.length})

但这对我来说似乎很难看。实现目标的首选方式是什么?

2 个答案:

答案 0 :(得分:3)

您可以尝试这项工作:

class Sound():
    def __init__(self, name, length):
        self.name = name
        self.length = length

@app.route('/sounds/<soundid>')
def get_sound(soundid):
    s = Sound('foobar', 23.4)
    return jsonify(s.__dict__)

答案 1 :(得分:2)

你可以通过几种不同的方式做到这一点。确保您只返回所需内容的最安全方法是这样做:

class Sound():
    name = None
    length = None
    test = "Test"

    def __init__(self, name, length):
        self.name = name
        self.length = length

@admin_app.route('/sounds/<sound_id>')
def get_sound(sound_id):
    s = Sound('foobar', sound_id)
    return jsonify(vars(s))

通过定义name = None,length = None作为类级别变量的一部分,您可以使用vars()与__dict__

当您通过__init__实例化该类并在其中设置变量时,jsonify将仅返回您通过__init__设置的内容。

以上代码的结果:

{
"length": "1",
"name": "foobar"
}