首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask jsonify:对象不可迭代

Flask jsonify:对象不可迭代
EN

Stack Overflow用户
提问于 2013-12-19 05:34:14
回答 2查看 6.4K关注 0票数 4

我有一个如下所示的类:

代码语言:javascript
复制
class Sound(SoundJsonSerializer):
    def __init__(self, name, length):
        self.name = name
        self.length = length

其中SoundJsonSerializer使我的自定义JSONEncoder能够将此对象序列化为JSON:

代码语言:javascript
复制
{
    "name": "foobar",
    "length": 23.4
}

现在,我希望我的一个请求能够准确地响应上面的JSON。

代码语言:javascript
复制
@app.route('/sounds/<soundid>')
def get_sound(soundid):
    s = Sound("foobar", 23.4)
    return jsonify(s)

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

我知道我可以通过显式地从我的Sound对象创建一个字典来做到这一点,如下所示:

代码语言:javascript
复制
    return jsonify({"name": s.name, "length": s.length})

但在我看来这真的很丑陋。实现我的目标的首选方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2013-12-19 10:20:37

您可以尝试以下工作:

代码语言:javascript
复制
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__)
票数 3
EN

Stack Overflow用户

发布于 2013-12-19 22:25:52

您可以通过几种不同的方法来完成此操作。确保你只返回你想要的东西的最安全的方法是这样做:

代码语言:javascript
复制
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__设置的内容。

以上代码的结果:

代码语言:javascript
复制
{
"length": "1",
"name": "foobar"
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20668883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档