【问题标题】:MongoDB Object Serialized as JSONMongoDB 对象序列化为 JSON
【发布时间】:2011-09-09 11:14:42
【问题描述】:

我正在尝试在我的 HTTP 响应中发回一个 JSON 编码的 MongoDB 对象。我已经关注了其他几个类似的问题,但仍然缺少一些东西。没有抛出异常,但我在浏览器中得到了一个神秘的 <api.views.MongoEncoder object at 0x80a0c02c> 响应。我确信这很简单,但我们将不胜感激。

功能:

from django.utils.simplejson import JSONEncoder
from pymongo.objectid import ObjectId

class MongoEncoder( JSONEncoder ):
     def _iterencode( self, o, markers = None ):
          if isinstance( o, ObjectId ):
               return """ObjectId("%s")""" % str(o)
          else:
               return JSONEncoder._iterencode(self, o, markers)

views.py:

user = User({
    's_email': request.GET.get('s_email', ''),
    's_password': request.GET.get('s_password', ''),
    's_first_name': request.GET.get('s_first_name', ''),
    's_last_name': request.GET.get('s_last_name', ''),
    'd_birthdate': request.GET.get('d_birthdate', ''),
    's_gender': request.GET.get('s_gender', ''),
    's_city': request.GET.get('s_city', ''),
    's_state': request.GET.get('s_state', ''),
})

response = {
    's_status': 'success',
    'data': user
}
return HttpResponse(MongoEncoder( response ))

我正在使用 Python 2.4、pymongo、simplejson。

【问题讨论】:

    标签: django mongodb pymongo simplejson


    【解决方案1】:

    在较新版本的simplejson(以及Python 2.7 中的json 模块)中,您可以在子类中实现default 方法:

    from json import JSONEncoder
    from pymongo.objectid import ObjectId
    
    class MongoEncoder(JSONEncoder):
        def default(self, obj, **kwargs):
            if isinstance(obj, ObjectId):
                return str(obj)
            else:            
                return JSONEncoder.default(obj, **kwargs)
    

    然后您可以将编码器与MongoEncoder().encode(obj)json.dumps(obj, cls=MongoEncoder) 一起使用。

    【讨论】:

    • 如果找不到pymongo.objectid,试试bson.objectid。
    • 基于这个答案,stackoverflow.com/a/10401553,ObjectID 不再在 pymongo.object id 中。相反,使用:import bson.objectid
    • 另外,您可以使用处理 ObjectId from bson.json_util import dumps 的 bson 转储,参见 stackoverflow.com/a/18405626/1346682
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2016-12-22
    • 2015-05-11
    • 2018-07-20
    相关资源
    最近更新 更多