簡體   English   中英

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

[英]Serializing MongoDB find() return into non-anonymous JSON array, using 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。

這里的問題是,在將響應傳遞到另一個數據結構(現在是字符串)之前,您已經將響應字符串化為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對象反序列化的本機字典,然后進一步放入您訂購的字典。

但是實際上,您的客戶不應該關心鍵的順序,而只希望那些根元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM