Объект MongoDB, сериализованный как JSON
Я пытаюсь отправить объект MongoDB в кодировке JSON обратно в ответ HTTP. Я следил за несколькими другими подобными вопросами, но все еще что-то упускаю. Никаких исключений не выбрасывается, но я получаю загадочный <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.
1 ответ
Решение
В новых версиях simplejson
(и json
модуль в Python 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)
Затем вы можете использовать кодировщик с MongoEncoder().encode(obj)
или же json.dumps(obj, cls=MongoEncoder)
,