【问题标题】:PyMongo and Flask's Jsonify contains escape slashesPyMongo 和 Flask 的 Jsonify 包含转义斜线
【发布时间】:2013-12-10 20:25:33
【问题描述】:

我正在尝试使用 Mongodb 集合中的 Flask 做出响应:

@app.route('/stories', methods = ['GET'])
def get_stories():
    stories = db.stories.find()

    json_docs = [json.dumps(doc, default=json_util.default) for doc in stories]

    resp = jsonify(data=json_docs)
    resp.status_code = 200

    return make_response(resp)

这会获取所有项目并将其编码为 JSON 响应,但它看起来像这样:

{
"data": [
   "{\"content\": \"some story here\", \"_id\": {\"$oid\": \"5293c34431e20307544db9cb\"}}", 
   "{\"content\": \"some story here\", \"_id\": {\"$oid\": \"5293c34d31e20307584c3e6e\"}}", 
   "{\"content\": \"some story here\", \"_id\": {\"$oid\": \"5293c57d31e20307a7b40abe\"}}"
   ]
}

有没有办法使用单引号对其进行编码,这样它就不会添加到转义字符串中?或者有什么我忽略的东西

【问题讨论】:

    标签: python json mongodb flask pymongo


    【解决方案1】:

    您正在编码两次

    json_docs = [json.dumps(doc, default=json_util.default) for doc in stories]
    
    resp = jsonify(data=json_docs)
    

    现在json_docs 中的每个条目都是一个表示 JSON 对象的字符串。

    删除json.dumps() 调用:

    resp = jsonify(data=stories)
    

    或将flask.json.dump()Response() 一起使用:

    resp = Response(json.dumps({'data': stories}, default=json_util.default),
                    mimetype='application/json')
    

    这让您仍然可以在光标对象上使用 json_util.default 处理程序。

    【讨论】:

    • 当我尝试这个时,它给了我一个Cursor not JSON serializable 类型错误。我很确定这与 ObjectID 有关。知道如何将其转换为 json 吗?
    • @Chris: 更新了,jsonify() 不会让你指定default 处理程序,所以你想自己构造Response() 对象,返回值为json.dumps()
    • 非常感谢,我现在明白了:)
    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2012-07-14
    • 2012-12-09
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多