我正在通过一些Json并且无法解析它。
对象目前很简单,只有一个键/值对。密钥工作正常,但值\d
会导致问题。
这是来自html表单,通过javascript。以下所有都是文字。
\d
{'Key': '\d'}
{"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)
但正如预期的那样失败。
在所有unescaping发生后,我看不到任何方法来解析应该包含单个反斜杠的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'
答案 0 :(得分:1)
使用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没有那么大改变......