我正在将一个JSON文件读入Python,其中包含转义的单引号( \')。这导致了各种各样的打嗝,如上所述。 here。但是,我找不到任何关于如何解决问题的内容。我刚做了一个
newstring=originalstring.replace(r"\'", "'")
事情已经成功了。但这看起来相当丑陋。我真的找不到关于如何在json docs中处理这类事情(创建异常或其他东西)的很多材料。
不幸的是,回到源头是不可能的。
感谢您的帮助!
答案 0 :(得分:1)
正确的做法是修复创建无效JSON文件的任何内容。但如果那不可能,我想是需要更换。但是你应该使用正则表达式,因此它不能用\\'
替换\'
- 在这种情况下,第一个反斜杠是逃避第二个反斜杠,它们并没有逃避引用。消极的后视将阻止这种情况。
import re
newstring = re.sub(r"(?<!\\)\\'", "'", originalstring)
答案 1 :(得分:1)
JSON standard定义了一组特定的valid 2-character escape sequences:\\
,\/
,\"
,\b
,\r
,{ {1}},\n
和\f
,以及一个4字符转义序列,用于定义任何Unicode代码点\t
(\uhhhh
加4个十六进制数字)。任何其他反斜杠加上其他字符的序列都是无效的JSON 。
如果你有一个JSON源,你无法修复,唯一的出路就是删除无效序列,就像你使用\u
一样,即使它有点脆弱(它&#39;当引号前面有一个偶数反斜杠序列时,中断。
您也可以使用正则表达式,删除在有效序列中未使用的任何反斜杠:
str.replace()
这不会发现像fixed = re.sub(r'(?<!\\)\\(?!["\\/bfnrt]|u[0-9a-fA-F]{4})', r'', inputstring)
这样的奇数反斜杠序列,但会抓住其他任何东西:
\\\
答案 2 :(得分:1)
解决方案还不错。这看起来很难看,因为这个问题很丑陋 - 你的数据已经损坏了。它当然简单,优雅,有效。只有当子串\\'
(这是三个字符,我没有逃避任何东西)出现在任何地方时,它才会失败,即使这样,只有当连续斜线的数量是偶数时才会失败。所以你的选择是:
if r"\\'" in originalstring
并抛出错误,如果是这样的话。简单,安全,可能很好。(\\\\)+
或其他内容使用带有负向lookbehind的正则表达式。查看此代码段:
import json
from json.decoder import JSONDecodeError
s = r'"\'"'
print(s)
try:
print(json.loads(s))
except JSONDecodeError as e:
print(vars(e))
输出:
"\'"
{'msg': 'Invalid \\escape', 'colno': 2, 'doc': '"\\\'"', 'pos': 1, 'lineno': 1}