6

JSONでエンコードされたMongoDBオブジェクトを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 ))

私はPython2.4、pymongo、simplejsonを使用しています。

4

1 に答える 1

18

新しいバージョン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)

MongoEncoder().encode(obj)次に、またはでエンコーダを使用できますjson.dumps(obj, cls=MongoEncoder)

于 2011-06-06T17:31:12.877 に答える