json.dumps vs flask.jsonify

Ser*_*rov 245 python json flask

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

data = {"id": str(album.id), "title": album.title}
Run Code Online (Sandbox Code Playgroud)

但我得到的东西与我所得到的json.dumps不同flask.jsonify.

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

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

Ken*_*lke 326

jsonify()flask中的函数返回一个flask.Response()对象,该对象已经具有适当的内容类型标题'application/json',以便与json响应一起使用.然而,该json.dumps()方法只返回一个编码字符串,这需要手动添加MIME类型标题.

有关此jsonify()功能的更多信息,请参阅此处.

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

  • `jsonify()`现在处理列表.参见[this commit](https://github.com/mitsuhiko/flask/commit/431db2874b242316051963d9bc4d5653b3647acc). (30认同)
  • 但它仍然没有将 SQLAlchemy 对象和列表转换为 JSON。 (3认同)

mik*_*obi 89

你可以做:

flask.jsonify(**data)
Run Code Online (Sandbox Code Playgroud)

要么

flask.jsonify(id=str(album.id), title=album.title)
Run Code Online (Sandbox Code Playgroud)


Mic*_*oka 77

这是 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')
Run Code Online (Sandbox Code Playgroud)

使用的json模块是simplejsonjson按此顺序.current_appFlask()对象的引用,即您的应用程序.response_class()是对Response()班级的参考.


cha*_*iya 33

选择一个或另一个取决于您打算做什么.据我所知:

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

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

  • @vidstige:**jsonify**生成一个flask.Response()对象,其标题设置为"content-type:application/json",其有效负载设置为转换为JSON字符串的dict.**dumps**只是转换为JSON字符串.它不是格式正确的flask.Response()对象.因此,如果您的视图显示"return json.dumps(dict)",那么收件人将获得常规的"content-type:text/html"响应,并将json.dumps输出作为有效负载. (8认同)
  • 我根本不明白它们之间的区别. (2认同)
  • @SamEsla是的,我知道,但这个答案都没有. (2认同)