MongoDB对象序列化为JSON

Don*_*nie 6 django simplejson mongodb pymongo

我正在尝试在我的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)
Run Code Online (Sandbox Code Playgroud)

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 ))
Run Code Online (Sandbox Code Playgroud)

我在Python 2.4,pymongo,simplejson.

zee*_*kay 17

在较新版本simplejson(以及jsonPython 2.7中的模块)中,您可以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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用MongoEncoder().encode(obj)或使用编码器json.dumps(obj, cls=MongoEncoder).

  • 如果你找不到pymongo.objectid,试试bson.objectid. (3认同)
  • 根据这个答案,http://stackoverflow.com/a/10401553,ObjectID不再位于pymongo.object id中.相反,使用:import bson.objectid (2认同)