无法加载包含转义序列的json

时间:2015-05-14 14:11:34

标签: python json python-3.x

我正在通过一些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)

但正如预期的那样失败。

在所有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'

1 个答案:

答案 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没有那么大改变......