Sankit Acharya
Sankit Acharya

Reputation: 45

Validate Json from pymongo Flask

I'm using Flask and Mongo DB to build a Rest API.

I'm not sure the data I'm getting from the MongoDB using pymongo is valid 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})

When I jsonify the hardcoded data is't showing neat and well formatted.

OUTPUT

{
 "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"
  }
 ]
}

But when I'm using data from the database. I'm not sure of the type and format.

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

Is it valid and normal?

Upvotes: 1

Views: 2844

Answers (1)

Wan B.
Wan B.

Reputation: 18845

As mentioned on one of the comments, you have are calling dumps twice. Note that flask.json.jsonify() is a function that wraps dumps().

Note that pymongo find() returns a cursor object not documents. For example you can try below:

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

If you would like serialise any of MongoDB JSON objects, such as ObjectId or Date(), you can utilise bson.json_util For example:

from bson import json_util 

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

Upvotes: 4

Related Questions