Flask的jsonify()中的压缩JSON

10
Flask提供了方便的jsonify()函数,它可以从Python变量返回JSON对象。
from flask import Flask, jsonify
app = Flask(__name__)

@app.route("/")
def json_hello():
    return jsonify({x:x*x for x in range(5)}), 200

if __name__ == "__main__":
    app.run(debug=True)

这会返回:

{
  "0": 0, 
  "1": 1, 
  "2": 4, 
  "3": 9, 
  "4": 16
}

(PS - 注意转换从int到string以符合JSON格式)。

对于长输出来说,这种缩进格式很浪费,我更喜欢最小化的版本:

{"1": 1, "0": 0, "3": 9, "2": 4, "4": 16}

如何从Flask的jsonify()中获取缩小版的JSON?


只需使用标准库中的 json.dumps 即可吗?(虽然严格来说这不是 压缩,只是没有漂亮的打印格式)。 - Lukas Graf
3个回答

19

除了另一个答案中提到的 JSONIFY_PRETTYPRINT_REGULAR,你也可以通过扩展flask的jsonencoder来消除列表元素之间的空格,具体如下:

from flask import Flask
from flask.json import JSONEncoder

class MiniJSONEncoder(JSONEncoder):
    """Minify JSON output."""
    item_separator = ','
    key_separator = ':'

app = Flask(__name__)
app.json_encoder = MiniJSONEncoder
app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False

对于item_separatorkey_separator的默认值都有一个尾随空格,因此通过像这样覆盖它们,您可以从输出中删除这些空格。

(严格来说,我想你可以只在默认的JSONEncoder上设置这些值,但我必须使用这种方法,因为我必须为其他原因重载JSONEncoder.default()


6
不确定这是不是针对旧版本的-但在当前的 Flask 版本中不再需要这样做。来自 Flask 文档(http://flask.pocoo.org/docs/0.12/api/):如果没有使用 X-Requested-With: XMLHttpRequest 来请求,此函数的响应将会被漂亮地打印以简化调试,除非 JSONIFY_PRETTYPRINT_REGULAR 配置参数设置为 false 。压缩(不漂亮的)格式目前意味着分隔符后没有缩进和空格。 - L__

14

只需将配置键JSONIFY_PRETTYPRINT_REGULAR设置为False - Flask会对JSON进行漂亮打印,除非通过AJAX请求(默认情况下)要求不进行打印。


1
虽然这有所帮助,可以去除缩进等,但仍包含不必要的空格,例如:[1, 5, 3] 而不是 [1,5,3] - Jonatan

3

如果current_app.config["JSONIFY_PRETTYPRINT_REGULAR"]True(默认为False)或应用处于调试模式,Flask 1.1将在jsonify()输出中添加缩进和空格。

源代码如下:

indent = None
separators = (",", ":")

if current_app.config["JSONIFY_PRETTYPRINT_REGULAR"] or current_app.debug:
    indent = 2
    separators = (", ", ": ")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接