3

我试图防止valuePOST 请求中的字符串(在本例中为变量)被转义,因为它要存储在 JSON 中。我的代码是

def addProduct(request):
    if request.POST:
        post = {}
        for key in request.POST:
            value = request.POST[key].encode('utf-8')
            try:
                value = json.loads(value).encode('utf-8')
            except Exception:
                pass
            post[key] = value.encode('utf-8')
        doc = json.dumps(post)

我可以看到的调试value是 unicode 类型,我相信这是 Django 处理请求对象的方式。实际的字符串虽然 unicode 直到post[key] = value. 如果我尝试更改它post[key] = value.encode('utf-8')以防止它被转义,我会收到错误消息:'ascii' codec can't decode byte 0xe2 in position 38: ordinal not in range(128)

有任何想法吗?

4

2 回答 2

3

如果您想json.dumps保留特殊字符,我认为您可能会发现这些参数很有用ensure_ascii=False

  1. 看看这个答案:Unicode values in strings are escaped when dumping to JSON in Python
  2. 这是文档json.dumps

而不是自己做,ensure_ascii=False我认为会解决json转义输出的问题。

前任:

json.dumps({'h':u'\xc2\xa3'},ensure_ascii=False)
>>>u'{"h": "\xc2\xa3"}'

更新:json.dumps有无ensure_ascii和 unicode 字符串的比较:

In [7]: json.dumps({'a':u'\u00a3'},ensure_ascii=False)
Out[7]: u'{"a": "\xa3"}'

In [8]: json.dumps({'a':u'\u00a3'})
Out[8]: '{"a": "\\u00a3"}'

希望这可以帮助!

于 2013-06-20T19:33:30.383 回答
0

我无法重现这个。我尝试同时提供 json.dumps Unicode 对象和 UTF-8 编码字节字符串,在这两种情况下,我都得到了正确的 Unicode 转义 json 数据:

>>> json.dumps({'foo': u'lölölö'})
'{"foo": "l\\u00f6l\\u00f6l\\u00f6"}'
>>> json.dumps({'foo': u'lölölö'.encode('utf8')})
'{"foo": "l\\u00f6l\\u00f6l\\u00f6"}'

我在 Python 2.6 和 2.7 以及 Python 3.1 中试过这个:

>>> json.dumps({'foo': 'lölölö'})
'{"foo": "l\\u00f6l\\u00f6l\\u00f6"}'
于 2013-06-20T19:22:42.253 回答