2010-12-10 509 views
29
for p in db.collection.find({"test_set":"abc"}): 
    posts.append(p) 
thejson = json.dumps({'results':posts}) 
return HttpResponse(thejson, mimetype="application/javascript") 

在我的Django/Python代碼中,由於「ObjectID」的原因,我無法從mongo查詢中返回JSON。該錯誤表示「ObjectID」不可序列化。如何將MongoDB查詢轉換爲JSON?

我該怎麼辦? 哈克的方法是遍歷:

for p in posts: 
    p['_id'] = "" 

回答

27

JSON模塊不會因工作之類的對象ID。

幸運的是PyMongo提供json_util這...

...讓[S]專門的編碼和BSON文檔轉換爲蒙戈 擴展JSON的嚴格模式的 解碼。這讓 你編碼/解碼BSON文檔到 JSON,即使他們使用特殊的BSON 類型。

這裏更多:http://api.mongodb.org/python/1.9%2B/api/bson/json_util.html#module-bson.json_util

+0

如何導入? – TIMEX 2010-12-10 03:07:54

+0

http://api.mongodb.org/python/1.9%2B/installation.html&http://api.mongodb.org/python/1.9%2B/tutorial.html&>>> import pymongo – 2010-12-10 03:09:05

+1

Full answer here :http://stackoverflow.com/a/27024423/1731454 – oferei 2015-05-12 08:03:33

8

這是很容易寫這與科佩斯的ObjectID自定義序列化。 Django中已經包含了一個負責處理小數和日期,這樣你就可以擴展:

from django.core.serializers.json import DjangoJSONEncoder 
from bson import objectid 

class MongoAwareEncoder(DjangoJSONEncoder): 
    """JSON encoder class that adds support for Mongo objectids.""" 
    def default(self, o): 
     if isinstance(o, objectid.ObjectId): 
      return str(o) 
     else: 
      return super(MongoAwareEncoder, self).default(o) 

現在你可以告訴json使用你的定製序列:

thejson = json.dumps({'results':posts}, cls=MongoAwareEncoder) 
20

下面是一個簡單的示例,使用pymongo 2.2.1

import os 
import sys 
import json 
import pymongo 
from bson import BSON 
from bson import json_util 

if __name__ == '__main__': 
    try: 
    connection = pymongo.Connection('mongodb://localhost:27017') 
    database = connection['mongotest'] 
    except: 
    print('Error: Unable to Connect') 
    connection = None 

    if connection is not None: 
    database["test"].insert({'name': 'foo'}) 
    doc = database["test"].find_one({'name': 'foo'}) 
    return json.dumps(doc, sort_keys=True, indent=4, default=json_util.default) 
2

東西更簡單使用 電機== 1.1 pymongo == 3.4這對我的作品上的Python 3.6。 0

from bson.json_util import dumps, loads 

for mongo_doc in await cursor.to_list(length=10): 
    # mongo_doc is a <class 'dict'> returned from the async mongo driver, in this acse motor/pymongo. 
    # result of executing a simple find() query. 

    json_string = dumps(mongo_doc) 
    # serialize the <class 'dict'> into a <class 'str'> 

    back_to_dict = loads(json_string) 
    # to unserialize, thus return the string back to a <class 'dict'> with the original 'ObjectID' type.