JSON.parse 带有转义字符

JSON.parse with escape characters

试图掌握 JSON.parse 并且很难理解转义字符的处理方式;具体 - 为什么:

JSON.parse('["\\\"\"a\""]')

评估为:

["\""a""]

多个反斜杠如何相互配合?

谢谢!

在这种情况下 JavaScript 转义实际上是分步进行的。基本上意味着字符串最初被转义,但之后的结果再次被转义。所以第一次转义是这样的:

Step 1: ["\\\"\"a\""] ==> ["(\)(\)(\)"\(\")a\(\")"] ==> ["\\"\"a\""]

在第一步中,每个 \ 转换为 \\" 转换为 "。更好地了解哪些项目正在转换(我在这一步中在转换后的项目周围添加了 (..),其中 (\) 转换为 \(\") 转换为 ").

Step2: ["\\"\"a\""] ==> ["(\)(\")(\")a(\")"] ==> ["\""a""]

和我一样的问题,但我用这个示例代码解决了。

def escape(str):
    str = str.replace('\', '\\').replace('"', '\"').replace('\n', '\n').
        replace('\t', '\t')
    result = []
    for ch in str:
        n = ord(ch)
        if n < 32:
            h = hex(n).replace('0x', '')
            result += ['\u%s%s' % ('0'*(4-len(h)), h)]
        else:
            result += [ch]
    return ''.join(result)

首先,让我们弄清楚我们实际使用的是什么值:

var str = '["\\\"\"a\""]';
console.log(str);
// => ["\\"\"a\""]

如您所见,其中一半反斜杠与 JSON 无关。他们只是转义 JavaScript 字符串中的字符。该字符串的实际字符是:

["\\"\"a\""]

我们知道方括号([])表示一个JSON数组,最外面的引号表示一个JSON字符串,所以我们去掉那些:

\\"\"a\"

现在,为了弄清楚这个 JSON 将反序列化到什么 JavaScript 字符串,让我们把它分解成几个部分:

\  \"  \"   a  \"
 1   2   3   4   5

我将每个反斜杠与其后面的字符配对(有时是另一个反斜杠——反斜杠与引号一样用反斜杠转义)。现在对于前面有反斜杠的每个字符,我们只需删除反斜杠:

\   "   "   a   "
1   2   3   4   5

现在再次将它们混合在一起:

\""a"

成功了吗?

var str = '["\\\"\"a\""]';
var array = JSON.parse(str);
console.log(array[0]);
// => \""a"

是的!

P.S。因为 JSON 和 JavaScript 转义的工作方式相同,所以您可以将相同的过程应用于原始 JavaScript 字符串:

["\\\"\"a\""]

再次拆分:

[   "  \  \  \   "  \   "   a  \   "   "   ]
1   2   3   4   5   6   7   8   9  10  11  12  13

您会注意到,在这种情况下,只有反斜杠被转义——那是因为在我们的 JavaScript 中,字符串被单引号括起来,所以双引号不必转义。现在,再次删除初始反斜杠,我们得到:

[   "   \   \   \   "   \   "   a   \   "   "   ]
1   2   3   4   5   6   7   8   9  10  11  12  13

再把它压在一起:

["\\"\"a\""]

您会认出这是我们开始时使用的原始值。