【发布时间】:2015-05-14 14:11:33
【问题描述】:
我传递了一些 Json,但无法解析它。
该对象目前很简单,只有一个键/值对。密钥工作正常,但值 \d 会导致问题。
这来自一个 html 表单,通过 javascript。以下都是文字。
- HTML:
\d - Javascript:
{'Key': '\d'} - Json:
{"Key": "\\d"}
json.loads() 似乎不喜欢这种格式的 Json。快速检查一下我没有做任何愚蠢的事情可以正常工作:
>>> import json
>>> json.loads('{"key":"value"}')
{'key': 'value'}
由于我在 Python 中声明了这个字符串,它应该将其转义为 va\\lue 的文字 - 当解析为 Json 时应该是 va\lue。
>>> json.loads('{"key":"va\\\\lue"}')
{'key': 'va\\lue'}
如果python 没有在进入的过程中转义字符串,我想我会在不加倍的情况下进行检查...
>>> json.loads('{"key":"va\\lue"}')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python33\lib\json\__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "C:\Python33\lib\json\decoder.py", line 352, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python33\lib\json\decoder.py", line 368, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Invalid \escape: line 1 column 11 (char 10)
但正如预期的那样失败了。
在所有转义发生后,我看不到任何解析应该包含单个反斜杠的 Json 字段的方法。
如何让 Python 将此字符串文字 {"a":"val\\ue"}(即 valid Json)反序列化为适当的 Python 表示形式:{'a': 'val\ue'}?
顺便说一句,PyDev 与其使用的字符串表示形式不一致并没有帮助。监视窗口显示双反斜杠,变量的工具提示显示四重反斜杠。我假设那是“如果你要输入字符串,这就是你必须使用它来转义到原始的”表示,但这绝不是清楚的。
编辑以继续 @twalberg 的回答...
>>> input={'a':'val\ue'}
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec cant decode bytes in position 3-5: truncated \uXXXX escape
>>> input={'a':'val\\ue'}
>>> input
{'a': 'val\\ue'}
>>> json.dumps(input)
'{"a": "val\\\\ue"}'
>>> json.loads(json.dumps(input))
{'a': 'val\\ue'}
>>> json.loads(json.dumps(input))['a']
'val\\ue'
【问题讨论】:
标签: python json python-3.x