2011-06-06 57 views
6

我試圖發送一個JSON編碼的MongoDB對象回我的HTTP響應。我跟着其他幾個類似的問題,但仍然錯過了一些東西。沒有例外情況發生,但我在瀏覽器中收到了一個神祕的<api.views.MongoEncoder object at 0x80a0c02c>響應。我相信這是簡單的,但任何幫助,將不勝感激。MongoDB對象序列化爲JSON

功能:

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。

回答

17

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)

+0

完美!謝謝。 – Donnie 2011-06-06 18:01:18

+0

謝謝!爲我節省了很多時間,找出答案。 – 2012-05-14 00:54:50

+3

如果您找不到pymongo.objectid,請嘗試bson.objectid。 – 2012-11-30 08:41:26