我的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。
答案 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,然后进一步加入你的命令。
但实际上你的客户不应该关心密钥的顺序而只是期望那些根元素。