带有转义字符的JSON.parse

时间:2015-10-22 05:51:36

标签: javascript json escaping

尝试获取JSON.parse的句柄,并且很难理解如何处理转义字符;具体 - 为什么:

make_pair(extension, type)

评估为:

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

多个反斜杠如何相互作用?

谢谢!

3 个答案:

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