json.dumps与flask.jsonify


276

我不确定我是否了解该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返回结果的结果。我究竟做错了什么?

Answers:


369

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

查看更多有关该jsonify()功能在这里完全参考。

编辑:另外,我注意到它可以jsonify()处理kwarg或字典,同时json.dumps()还支持列表和其他列表。


31
jsonify()现在处理列表。看到这个提交
杰夫·威德曼

3
但是它仍然不能将SQLAlchemy对象和列表转换为JSON。
ajbraus

91

你可以做:

flask.jsonify(**data)

要么

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

82

这是 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使用的模块是simplejsonjson顺序相同。current_app是对Flask()对象(即您的应用程序)的引用。response_class()是对该Response()类的引用。


42

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

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

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


4
我根本不了解区别。
vidstige,2015年

11
@vidstige:jsonify创建一个flask.Response()对象,其标头设置为“ content-type:application / json”,其有效载荷设置为转换为JSON字符串字典。转储只是使转换为JSON字符串。这不是格式正确的flask.Response()对象。因此,如果您的视图显示“ return json.dumps(dict)”,那么接收者将仅收到常规的“ content-type:text / html”响应,并将json.dumps输出作为有效负载。
SamEsla

3
@SamEsla是的,我知道,但是此答案中没有任何信息。
vidstige

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.