2013-11-25 35 views
3

我試圖讓使用瓶從MongoDB中收集的響應:PyMongo和瓶的Jsonify包含逃生斜線

@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\"}}" 
    ] 
} 

有沒有一種方法來使用單引號進行編碼,所以它不會添加到轉義字符串中?或者是有什麼我俯瞰

回答

7

您編碼兩次

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處理程序上的光標對象依然。

+0

當我嘗試這個,它給了我一個'光標不JSON序列化'類型的錯誤。我很確定這與ObjectID有關。任何想法如何將其轉換爲json? – Chris

+0

@Chris:更新後,'jsonify()'不會讓你指定一個'default'處理器,所以你想直接用'json.dumps()'的返回值自己構造'Response()'對象。 –

+0

非常感謝,我現在明白了:) – Chris