【问题标题】:django, "is not JSON serializable" when using ugettext_lazy?django,使用 ugettext_lazy 时“不是 JSON 可序列化”?
【发布时间】:2013-11-13 02:58:20
【问题描述】:

我的views.py有这个

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

为什么?我做错了什么?

【问题讨论】:

  • 它不再是字符串,而是 django.utils.functional.__proxy__ 对象;)尝试用它们调用 unicode。

标签: python django json


【解决方案1】:

您还可以创建自己的 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')

【讨论】:

    【解决方案2】:

    它还不是一个字符串,Python 的 JSON 编码器不知道 ugettext_lazy,所以你必须强制它变成一个类似的字符串

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

    【讨论】:

    • 如果你使用 Python3,你会怎么做?
    • 我还没有在 Python 3 中使用过 Django,但是 string() 而不是 unicode 应该可以做同样的事情。
    • 你的意思是str()
    猜你喜欢
    • 2017-06-18
    • 2013-04-29
    • 1970-01-01
    • 2018-09-12
    • 2013-05-23
    • 2015-02-24
    • 2019-12-27
    • 2014-10-23
    • 2019-06-17
    相关资源
    最近更新 更多