2013-11-01 9 views
10

मैं अपने views.pydjango, ugettext_lazy का उपयोग करते समय "JSON serializable नहीं है"?

response_dict = { 
    'status': status, 
    'message': message 
} 
return HttpResponse(simplejson.dumps(response_dict), 
        mimetype='application/javascript') 

में यह है के बाद से मैं इस आयात का उपयोग शुरू: इस लाइन पर

from django.utils.translation import ugettext_lazy as _

:

message = _('This is a test message')

मैं इस त्रुटि मिलती है:

File "/home/chris/work/project/prokject/main/views.py", line 830, in fooFunc 
    return HttpResponse(simplejson.dumps(response_dict), 

    File "/usr/local/lib/python2.7/json/__init__.py", line 243, in dumps 
    return _default_encoder.encode(obj) 

    File "/usr/local/lib/python2.7/json/encoder.py", line 207, in encode 
    chunks = self.iterencode(o, _one_shot=True) 

    File "/usr/local/lib/python2.7/json/encoder.py", line 270, in iterencode 
    return _iterencode(o, 0) 

    File "/usr/local/lib/python2.7/json/encoder.py", line 184, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 

TypeError: <django.utils.functional.__proxy__ object at 0x7f42d581b590> is not JSON serializable 

क्यों? मैं क्या गलत कर रहा हूं?

+1

यह तार अब और नहीं है, लेकिन django.utils.functional .__ proxy__ वस्तुओं;) उन लोगों के साथ यूनिकोड से कॉल करके। – XORcist

उत्तर

18

यह एक स्ट्रिंग अभी तक नहीं है, और अजगर के JSON एनकोडर ugettext_lazy बारे में पता नहीं है, तो आप की तरह

response_dict = { 
    'status': status, 
    'message': unicode(message) 
} 
+0

यदि आप Python3 का उपयोग कर रहे थे तो आप क्या करेंगे? – JustinHui

+0

मैंने अभी तक पायथन 3 के साथ Django का उपयोग नहीं किया है, लेकिन यूनिकोड के बजाय 'स्ट्रिंग() 'को वही काम करना चाहिए। – RemcoGerlich

+2

आपका मतलब है 'str() ' –

27

कुछ के साथ एक स्ट्रिंग बनने के लिए यह मजबूर करने के लिए तुम भी आप ही JSON बना सकते हैं होगा एन्कोडर जो __proxy__ को यूनिकोड पर मजबूर करेगा।

https://docs.djangoproject.com/en/1.8/topics/serialization/

from django.utils.functional import Promise 
from django.utils.encoding import force_text 
from django.core.serializers.json import DjangoJSONEncoder 

class LazyEncoder(DjangoJSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, Promise): 
      return force_text(obj) 
     return super(LazyEncoder, self).default(obj) 

से तो अब अपने कोड देख सकते हैं जैसे:

response_dict = { 
    'status': status, 
    'message': _('Your message') 
} 

return HttpResponse(json.dumps(response_dict, cls=LazyEncoder), 
        mimetype='application/javascript') 
संबंधित मुद्दे