序列化MongoDB find()使用PyMongo返回非匿名JSON数组

时间:2014-04-11 23:49:45

标签: python mongodb mongodb-query pymongo

我的Python代码查询MongoDB并获取以下对象的数组

{
    u'attribute': u'value',
    u'_id': ObjectId('534776c66e5987041f6154bd')
}

我想要实现的是返回以下JSON:

{
    'mycollectionkey' : [
        {
            'attribute':'value',
            '_id': ObjectId('534776c66e5987041f6154bd')
        },
        ...and so on.
     ]
}

然而,当我这样做时:

docs = mongodb.find(...query...)
docs_json = bson.json_util.dumps(docs)
return flask.jsonify(success=True,mycollectionkey=docs_json)

我得到:{ 'mycollectionkey' : "*giant string representation of data*" }所谓的巨型字符串,显然不再是JSON。

1 个答案:

答案 0 :(得分:1)

这里的问题是你已经将响应字符串化为JSON,然后将其传递到另一个数据结构(现在作为字符串),以便将其作为JSON返回。所以你基本上做了双重编码,“字符串”被编码。

所以只需传递一次数据:

docs = mongodb.find(...query...)
return bson.json_util.dumps({ 'success': True, 'mycollectionKey': docs })

所以在这样的小集合上:

{ "_id" : ObjectId("5343aeb5efbdb94c3647c8df"), "field" : "BBB" }
{ "_id" : ObjectId("5343aebbefbdb94c3647c8e0"), "field" : "aaa" }
{ "_id" : ObjectId("5343aebfefbdb94c3647c8e1"), "field" : "AAA" }

哟得到这样的结果:

{   
    "mycollectionKey": [
        {"field": "BBB", "_id": {"$oid": "5343aeb5efbdb94c3647c8df"}}, 
        {"field": "aaa", "_id": {"$oid": "5343aebbefbdb94c3647c8e0"}}, 
        {"field": "AAA", "_id": {"$oid": "5343aebfefbdb94c3647c8e1"}}
    ], 
    "success": true
}

如果你真的担心这两个键的顺序,那么你可以使用bson“dumps”去一个字符串,然后用标准的json解码器解码,以获得一个带有反序列化的Mongo对象的本机dict,然后进一步加入你的命令。

但实际上你的客户不应该关心密钥的顺序而只是期望那些根元素。