繁体   English   中英

Flask jsonify:对象不可迭代

[英]Flask jsonify: object is not iterable

我的课程如下:

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})

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

您可以尝试这项工作:

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__)

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

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"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM