2017-09-18 83 views
0

我使用Flask和Mongo DB来构建Rest API。从pymongo Flask验证Json

我不确定使用pymongo从MongoDB获得的数据是否是有效的JSON。

CODE

tasks = [ 
{ 
    'id': 1, 
    'title': u'Buy groceries', 
    'description': u'Milk, Cheese, Pizza, Fruit, Tylenol', 
    'done': False 
}, 
{ 
    'id': 2, 
    'title': u'Learn Python', 
    'description': u'Need to find a good Python tutorial on the web', 
    'done': False 
} 
] 


@app.route('/tankover/api/v1.0/posts', methods=['GET']) 
def post(): 
    db = connection.posthub 
    cursor = dumps(db.post.find()) 
    return jsonify({'cursor': cursor}) 

当我jsonify硬编码的数据表示岂不等于整齐和井格式化。

输出

{ 
"cursor": [ 
    { 
    "description": "Milk, Cheese, Pizza, Fruit, Tylenol", 
    "done": false, 
    "id": 1, 
    "title": "Buy groceries" 
    }, 
    { 
    "description": "Need to find a good Python tutorial on the web", 
    "done": false, 
    "id": 2, 
    "title": "Learn Python" 
    } 
] 
} 

但是,当我使用数据库中的数据。我不确定类型和格式。

{ 
"cursor": "[{\"title\": \"sankit\", \"_id\" 
{\"$oid\":\"597619b7c07b2dc30a108def\"}, \"description\": \"hello to 
everyone we are up 
for a great start and moving good\", \"tags\": [\"demo1\", \"demo2\"]}, 
{\"_id\": {\"$oid\": \"59761b2cc6568a4e341b6b89\"}, \"description\": \"lets 
add some thing new\", \"tags\": [\"bonjour\", \"salut\"], \"title\": 
\"hi\"}, 
{\"_id\": {\"$oid\": \"59a5c5f6c6568a0be4447dfb\"}, \"description\": \"okay 
okay okay\", \"tags\": [\"socks\", \"gifts\"], \"title\": \"tinni\"}]" 
} 

它有效且正常吗?

+0

您是双重编码数据,一次用'dump()',一次用'jsonify()'。 –

+0

如果我只用jsonify它给错误:<在0x0308D750 pymongo.cursor.Cursor对象>不是JSON序列化,如果我只用清除其给错误:类型错误:“快译通”对象不是可调用 –

回答

2

正如其中一条评论所述,您已拨打dumps两次。请注意,flask.json.jsonify()是一种包装dumps()的功能。

请注意,pymongo find()返回一个游标对象不是文档。例如,你可以试试下面:

def post(): 
    db = connection.posthub 
    documents = [doc for doc in db.post.find({}, {"_id":0})] 
    return jsonify({'cursor': documents}) 

如果您想连载任何MongoDB的JSON对象,如ObjectIdDate(),你可以利用bson.json_util 例如:

from bson import json_util 

def post(): 
    db = connection.posthub 
    documents = [doc for doc in db.post.find({})] 
    return json_util.dumps({'cursor': documents}) 
+0

我尝试这样做,它给类型错误:ypeError:ObjectId('597619b7c07b2dc30a108def')不是JSON可序列化 –

+0

我更新了上面的答案以回答您的评论。总之,你不能任意序列化Python对象(不提供编码器/解码器)现在 –

+0

它的工作完美的,我现在明白了这个概念。谢谢 :) –