尝试获取JSON.parse的句柄,并且很难理解如何处理转义字符;具体 - 为什么:
make_pair(extension, type)
评估为:
JSON.parse('["\\\\\\"\\"a\\""]')
多个反斜杠如何相互作用?
谢谢!
答案 0 :(得分:4)
首先,让我们澄清一下我们实际使用的价值:
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\""]
您会认识到这是我们开始时的原始价值。
答案 1 :(得分:0)
在这种情况下,JavaScript转义实际上是分步进行的。基本上意味着字符串最初是转义的,但之后的结果会再次转义。所以第一次逃脱就是这样:
第1步:
["\\\\\\"\\"a\\""]
==>["(\\)(\\)(\\)"\(\")a\(\")"]
==>["\\\"\"a\""]
在第一步中,每个\\
转换为\
和\"
转换为"
。更好地了解正在转换的项目(我在此步骤中为已转换的项目添加了(..)
,其中(\\)
转换为\
而(\")
转换为{{ 1}})。
第2步:
"
==>["\\\"\"a\""]
==>["(\\)(\")(\")a(\")"]
答案 2 :(得分:0)
与我同样的问题,但我用这个示例代码解决了。
// Get the group UI elements in one of which the 'Get' button is located.
grps = Application("System Events").applicationProcesses['iTunes'].
windows[0].splitterGroups[0].scrollAreas[0].uiElements[0].groups
// Loop over groups
count = grps.length
for (i = 0; i < count; ++i) {
// In the group at hand, find all buttons whose description contains 'Get'.
btns = grps[i].entireContents().filter(function(el) {
try {
return el.role() == 'AXButton'
&&
el.description().match(/\bGet\b/)
} catch (e) {}
})
// Exit loop, if a 'Get' button was found.
if (btns.length > 0) break
}
if (btns.length == 0) {
console.log('ERROR: No "Get" button found.')
} else {
// Click on the 1st button found.
btns[0].click()
}