2010-12-10 205 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.