【问题标题】:simplejson.loads() get Invalid \escape: 'x'simplejson.loads() 获取无效 \escape: 'x'
【发布时间】:2010-11-28 08:49:15
【问题描述】:

我正在学习如何使用 simplejson 来解码 JSON 文件。但是我遇到了“无效\转义”错误。 这是代码

import simplejson as json

def main():
    json.loads(r'{"test":"\x27"}')

if __name__ == '__main__':
    main()

这是错误信息

Traceback (most recent call last):
  File "hello_world.py", line 7, in <module>
    main()
  File "hello_world.py", line 4, in main
    json.loads(r'{"test":"\x27"}')
  File "C:\Users\zhangkai\python\simplejson\__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "C:\Users\zhangkai\python\simplejson\decoder.py", line 335, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\zhangkai\python\simplejson\decoder.py", line 351, in raw_decode

    obj, end = self.scan_once(s, idx)
  File "C:\Users\zhangkai\python\simplejson\scanner.py", line 36, in _scan_once
    return parse_object((string, idx + 1), encoding, strict, _scan_once, object_
hook)
  File "C:\Users\zhangkai\python\simplejson\decoder.py", line 185, in JSONObject

    value, end = scan_once(s, end)
  File "C:\Users\zhangkai\python\simplejson\scanner.py", line 34, in _scan_once
    return parse_string(string, idx + 1, encoding, strict)
  File "C:\Users\zhangkai\python\simplejson\decoder.py", line 114, in py_scanstr
ing
    raise ValueError(errmsg(msg, s, end))
ValueError: Invalid \escape: 'x': line 1 column 10 (char 10)

我认为 json 解析器应该能够识别转义。所以我想知道哪里出了问题,我该怎么办。

【问题讨论】:

标签: python escaping simplejson


【解决方案1】:

JSON 没有像某些语言(包括 JavaScript)和符号 details here 那样的十六进制转义 (\xNN)。它有一个 unicode 转义,\uNNNN,其中NNNN 是四个十六进制数字,但没有\x 十六进制转义。

【讨论】:

  • 谢谢。所以如果 JSON 文件有 \x 符号,我应该先自己转换它?
  • @user308587:如果文件有 \x 表示法,则它不是 JSON 格式。如果您无论如何都想接受无效的 JSON,是的,您必须自己进行预处理。假设您想以 JavaScript 的方式处理 \x,请将 \xNN 转换为 \u00NN(例如,\x27 变为 \u0027)。 FWIW,\x\u 如何由 JavaScript 处理——not JSON——在the ECMAScript spec 的第 7.8.4 节中介绍。但我的阅读是它实际上只是将x 更改为u 并添加前导零的问题。最好的,
  • @T.J.Crowder 你能详细说明一下just a matter of changing the x to a u and adding the leading zeroes 吗?如何处理大字符串中的字符?
  • @Volatil3:假设您在字符串中有原始 JSON,例如:str = '{"foo": "bar\\x23 testing 1 2 3 \\x23"}' 您可以通过简单的替换将它们转换为\u 表示法:str2 = str.replace(/\\x/g, "\\u00") 然后str2 将成功解析,并且您将拥有一个具有属性foo 的对象,其值为"bar# testing 1 2 3 #"(因为\x23 / \u0023#)。
  • @Vitaliy: eval 接受它不会变成 JSON。 eval 也接受字符串 (function foo() { alert("Not JSON"); })() (jsfiddle.net/whghsf6o),但这也不是 JSON。 :-) 虽然一些实际的 JSON 解析器(而不是 eval)确实接受 \xNN 表示法(例如 V8),但它不是有效的 JSON。 the JSON website linked above 以及 the RFCthe Standard (pdf) 中的详细信息。字符串中的\xNN 是有效的 JavaScript,但不是有效的 JSON
【解决方案2】:

这是解析器的预期行为,因为 JSON 无效;在一个字符串中,斜线后面只能跟 "\/bfnrtu(必须是后跟 4 个十六进制字符)。不允许使用 x。请参阅http://json.org/ 的规范

【讨论】:

    【解决方案3】:

    试试python-cjson

    import cjson
    s = cjson.encode({'abc':123,'def':'xyz'})
    print 'json: %s - %s' % (type(s), s)
    s = cjson.decode(s)
    print '%s - %s' % (type(s), s)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多