Search code examples
pythonjsonmongodbflask-restful

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?


Solution

  • 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})