我的 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。
最佳答案
这里的问题是,在将响应传递到另一个数据结构(现在作为字符串)之前,您已经将响应字符串化为 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“转储”转到一个字符串,然后使用标准的 json 解码器进行解码,以获得反序列化的 Mongo 对象的 native 字典,然后进一步放入您订购的字典中。
但实际上您的客户不应该关心键的顺序,而只需要那些根元素。
关于python - 使用 PyMongo 将 MongoDB find() 序列化为非匿名 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23024356/