我正在尝试阻止POST请求中的字符串(在本例中为value
变量)进行转义,因为它要存储在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)
有什么想法吗?
答案 0 :(得分:3)
如果您希望json.dumps
维护特殊字符,我认为您可能会发现参数ensure_ascii=False
很有用。
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"}'
希望这有帮助!
答案 1 :(得分: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"}'