【问题标题】:json.dumps vs flask.jsonifyjson.dumps 与 flask.jsonify
【发布时间】:2011-12-15 23:52:27
【问题描述】:

我不确定我是否理解flask.jsonify 方法的目的。我尝试从中创建一个 JSON 字符串:

data = {"id": str(album.id), "title": album.title}

但是我从json.dumps 得到的与我从flask.jsonify 得到的不同。

json.dumps(data): [{"id": "4ea856fd6506ae0db42702dd", "title": "Business"}]
flask.jsonify(data): {"id":…, "title":…}

显然我需要得到一个看起来更像json.dumps 返回的结果。我做错了什么?

【问题讨论】:

    标签: python json flask


    【解决方案1】:

    flask 中的 jsonify() 函数返回一个 flask.Response() 对象,该对象已经具有用于 json 响应的相应内容类型标头“application/json”。而json.dumps() 方法只会返回一个编码字符串,这需要手动添加 MIME 类型标头。

    详细了解jsonify() 函数here 以获取完整参考。

    编辑: 另外,我注意到jsonify() 处理kwargs 或字典,而json.dumps() 还支持列表和其他。

    【讨论】:

    • jsonify() 现在处理列表。见this commit
    • 但它仍然没有将 SQLAlchemy 对象和列表转换为 JSON。
    • 我使用 jsonify 将 json 发送到客户端。虽然对于较小的字典,响应工作正常,但对于大型数组,我在浏览器上收到内容长度不匹配错误。关于为什么会发生这种情况的任何想法?我可以发送的数据量有限制吗?
    【解决方案2】:

    考虑

    data={'fld':'hello'}
    

    现在

    jsonify(data)
    

    将产生 {'fld':'hello'} 和

    json.dumps(data)
    

    给了

    "<html><body><p>{'fld':'hello'}</p></body></html>"
    

    【讨论】:

    • 如果我们谈论的是 Python,那么不,输出不像你描述的那样
    【解决方案3】:

    选择一个或另一个取决于您打算做什么。 据我了解:

    • jsonify 在构建 API 时会很有用,有人会查询并期望得到 json 作为回报。例如:REST github API 可以使用此方法来回答您的请求。

    • dumps,更多的是关于将数据/python 对象格式化为 json 并在您的应用程序中处理它。例如,我需要将一个对象传递给我的表示层,其中一些 javascript 将显示图形。您将使用转储生成的 Json 提供 javascript。

    【讨论】:

    • 我完全不明白其中的区别。
    • @vidstige: jsonify 创建一个 flask.Response() 对象,其标头设置为“content-type: application/json”,其有效负载设置为转换为-JSON 字符串字典。 dumps 只是制作一个转换为 JSON 的字符串。它不是格式正确的 flask.Response() 对象。因此,如果您的视图显示“return json.dumps(dict)”,那么接收者只会得到一个常规的“content-type:text/html”响应,其中 json.dumps 输出作为有效负载。
    • @SamEsla 是的,我知道,但是这个答案中没有任何信息。
    【解决方案4】:

    这是flask.jsonify()

    def jsonify(*args, **kwargs):
        if __debug__:
            _assert_have_json()
        return current_app.response_class(json.dumps(dict(*args, **kwargs),
            indent=None if request.is_xhr else 2), mimetype='application/json')
    

    使用的json 模块按顺序是simplejsonjsoncurrent_app 是对 Flask() 对象的引用,即您的应用程序。 response_class() 是对 Response() 类的引用。

    【讨论】:

      【解决方案5】:

      你可以这样做:

      flask.jsonify(**data)
      

      flask.jsonify(id=str(album.id), title=album.title)
      

      【讨论】:

        猜你喜欢
        • 2016-04-30
        • 2019-11-22
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        相关资源
        最近更新 更多