Minified JSON in flask's jsonify()

冷暖自知 提交于 2020-01-02 06:15:29

问题


Flask offers the convenient jsonify() function, which returns a JSON object from Python variables:

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)

Which returns:

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

(PS - note the conversion from int to string to comply with JSON).

This indented format is wasteful for long outputs, and I prefer the minified version:

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

How can I get the JSON in minified version from Flask's jsonify()?


回答1:


Simply set the configuration key JSONIFY_PRETTYPRINT_REGULAR to False - Flask pretty-prints JSON unless it is requested by an AJAX request (by default).




回答2:


In addition to the other answer of JSONIFY_PRETTYPRINT_REGULAR, you can also get rid of the spaces between list elements by extending flask's jsonencoder, like so:

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

The default values for item_separator and key_separator have a trailing space each, so by overriding them like this, you remove those spaces from the output.

(strictly speaking I suppose you could just set those values on the default JSONEncoder but I needed this approach since I had to overload JSONEncoder.default() for other reasons anyway)



来源:https://stackoverflow.com/questions/25773493/minified-json-in-flasks-jsonify

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!