我正在传递一些 Json,但在解析它时遇到问题。
该对象目前很简单,只有一个键/值对。 key 工作正常,但值 \d
导致问题。
这是通过 javascript 来自 html 表单。以下所有内容均为文字。
- 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 与其使用的字符串表示形式不一致并没有帮助。监 window 口显示双反斜杠,变量的工具提示显示四反斜杠。我认为这就是“如果您要输入字符串,则必须使用它才能转义为原始”表示形式,但这绝不是明确的。
编辑以跟进 @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'
最佳答案
使用 json.dumps()
查看 json
如何表示您的目标字符串:
>>> orig = { 'a' : 'val\ue' }
>>> jstring = json.dumps(orig)
>>> print jstring
{"a": "val\\ue"}
>>> extracted = json.loads(jstring)
>>> print extracted
{u'a': u'val\\ue'}
>>> print extracted['a']
val\ue
>>>
不过,这是在 Python 2.7.3 中,因此它可能仅与您的 Python 3.x 环境部分相关。尽管如此,我认为 JSON 并没有改变那么多......
关于python - 无法加载包含转义序列的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30239572/