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\""]
您会认出这是我们开始时使用的原始值。
试图掌握 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\""]
您会认出这是我们开始时使用的原始值。