2011-06-06 13 views
6

के रूप में सीरियलाइज्ड मैं अपने 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)) 

मैं अजगर 2.4 पर हूँ, pymongo, simplejson।

उत्तर

17

simplejson के नए संस्करण (और अजगर 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

+0

धन्यवाद! मुझे बहुत समय बचा है कि यह पता लगाया गया है .. –

+3

यदि आप pymongo.objectid नहीं पा रहे हैं, तो bson.objectid आज़माएं। –