【问题标题】:Unable to load json containing escape sequences无法加载包含转义序列的 json
【发布时间】: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


    【解决方案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 并没有发生太大变化……

    【讨论】:

    • 很有趣,谢谢。看起来 Unicode 搅拌处理是一个小问题,因为您的第一行在 3.x 中无效 - \u 是 Unicode 转义的开始。我刚刚经历了与您相同的情况并将其添加到我的问题中。似乎还是不对。编辑:啊!使用print 会删除其中一个反斜杠并且看起来是正确的。我确实希望 python 更清楚地知道它何时显示真正的价值以及何时转义。不知道这是否解决了我的问题,让我做一些挖掘并回复你
    猜你喜欢
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2010-11-13
    • 2021-09-18
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多