处理JSON中的误用字符

2024-10-01 02:25:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个JSON文件读入Python,其中包含转义单引号(\')。这会导致各种各样的打嗝,正如我们所讨论的here。然而,我找不到任何关于如何解决这个问题的东西。我刚做了一个

newstring=originalstring.replace(r"\'", "'")

一切都解决了。但这看起来很难看。在json docs中,我真的找不到很多关于如何处理这种事情(创建异常或其他事情)的材料。在

  • 对于这样的问题,有没有一个好的、干净的程序?在

很遗憾,回到源头是不可能的。在

谢谢你的帮助!在


Tags: 文件程序jsondocshere事情replace材料
3条回答

JSON standard定义了一组特定的valid 2-character escape sequences:\\\/\"\b\r\n\f和{},以及一个4个字符的转义序列来定义任何Unicode代码点,\uhhhh\u加4个十六进制数字)。反斜杠和其他字符的任何其他序列都是无效的JSON。在

如果您有一个JSON源代码,否则您无法修复,唯一的办法就是删除无效序列,就像您对str.replace()所做的那样,即使它有点脆弱(当引号前面有一个偶数的反斜杠序列时,它将中断)。在

您也可以使用正则表达式,删除有效序列中未使用的任何反斜杠:

fixed = re.sub(r'(?<!\\)\\(?!["\\/bfnrt]|u[0-9a-fA-F]{4})', r'', inputstring)

这不会捕获奇数反斜杠序列,如\\\,但会捕获其他任何内容:

^{pr2}$

解决办法不错。它看起来很难看,因为问题是丑陋的-你有损坏的数据。它当然简单,优雅,有效。只有当子字符串\\'(这是三个字符,我没有转义任何内容)出现在任何地方,并且只有在连续斜杠的数量为偶数时,它才会失败。所以你的选择是:

  1. 只需执行当前的操作,但首先检查if r"\\'" in originalstring,如果是,则抛出一个错误。简单,安全,也许可以。在
  2. (\\\\)+或其他内容使用带否定lookbehind的regex。在
  3. 捕获错误并使用错误的属性来决定要替换的字符串的一部分。在

查看以下片段:

import json
from json.decoder import JSONDecodeError

s = r'"\'"'
print(s)
try:
    print(json.loads(s))
except JSONDecodeError as e:
    print(vars(e))

输出:

^{pr2}$

正确的做法是修复创建无效JSON文件的任何内容。但如果不可能的话,我想需要更换。但是您应该使用正则表达式,这样它就不会将\\'替换为\'。在这种情况下,第一个反斜杠是转义第二个反斜杠,而不是转义引号。消极的观察会阻止这种情况的发生。在

import re
newstring = re.sub(r"(?<!\\)\\'", "'", originalstring)

相关问题 更多 >