簡體   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