JSON standard 定义了一组特定的valid 2-character escape sequences:\\、\/、\"、\b、\r、\n、\f 和一个\t, - 用于定义任何 Unicode 代码点的字符转义序列,\uhhhh(\u 加上 4 个十六进制数字)。任何其他反斜杠序列加上其他字符都是无效的 JSON。
如果你有一个 JSON 源,否则你无法修复,唯一的出路是删除无效序列,就像你对 str.replace() 所做的那样,即使它有点脆弱(它会 break 当引号前面有一个偶数反斜杠序列时)。
您也可以使用正则表达式,在其中删除 任何 未在有效序列中使用的反斜杠:
fixed = re.sub(r'(?<!\\)\\(?!["\\/bfnrt]|u[0-9a-fA-F]{4})', r'', inputstring)
这不会捕获像\\\ 这样的奇数反斜杠序列,但会捕获其他任何内容:
>>> import re, json
>>> broken = r'"JSON string with escaped quote: \' and various other broken escapes: \a \& \$ and a newline!\n"'
>>> json.loads(broken)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Invalid \escape: line 1 column 34 (char 33)
>>> json.loads(re.sub(r'(?<!\\)\\(?!["\\/bfnrt]|u[0-9a-fA-F]{4})', r'', broken))
"JSON string with escaped quote: ' and various other broken escapes: a & $ and a newline!\n"