处理JSON中错误转义的字符

时间:2016-06-07 21:09:04

标签: python json string file-io data-structures

我正在将一个JSON文件读入Python,其中包含转义的单引号( \')。这导致了各种各样的打嗝,如上所述。 here。但是,我找不到任何关于如何解决问题的内容。我刚做了一个

newstring=originalstring.replace(r"\'", "'")
事情已经成功了。但这看起来相当丑陋。我真的找不到关于如何在json docs中处理这类事情(创建异常或其他东西)的很多材料。

  • 这样的问题是否有一个良好,干净的程序?

不幸的是,回到源头是不可能的。

感谢您的帮助!

3 个答案:

答案 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)

解决方案还不错。这看起来很难看,因为这个问题很丑陋 - 你的数据已经损坏了。它当然简单,优雅,有效。只有当子串\\'(这是三个字符,我没有逃避任何东西)出现在任何地方时,它才会失败,即使这样,只有当连续斜线的数量是偶数时才会失败。所以你的选择是:

  1. 只做你当前的事情,但首先检查if r"\\'" in originalstring并抛出错误,如果是这样的话。简单,安全,可能很好。
  2. (\\\\)+或其他内容使用带有负向lookbehind的正则表达式。
  3. 捕获错误并使用错误的属性来决定要替换的字符串的一部分。
  4. 查看此代码段:

    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}