2013-11-01 22 views
10

我有這個在我的views.pydjango,「使用ugettext_lazy時不是JSON序列化」?

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__對象;)嘗試調用的Unicode他們。 – XORcist

回答

18

這還不是一個字符串,Python的JSON編碼器不知道ugettext_lazy,所以你必須迫使它成爲的東西串像

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

如果你使用Python3,你會怎麼做? – JustinHui

+0

我還沒有用Python 3的Django,但'string()'而不是unicode應該做同樣的事情。 – RemcoGerlich

+2

你的意思是'str()' –

27

你也可以創建你自己的JSON編碼器將強制__proxy__ unicode。

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') 
相關問題