Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带转义字符的JSON.parse_Javascript_Json_Escaping - Fatal编程技术网

Javascript 带转义字符的JSON.parse

Javascript 带转义字符的JSON.parse,javascript,json,escaping,Javascript,Json,Escaping,试图获得JSON.parse的句柄,并且很难理解转义字符是如何处理的;具体而言——为什么: JSON.parse('["\\\\\\"\\"a\\""]') 评估: ["\""a""] 多个反斜杠如何相互作用 谢谢 在这种情况下,JavaScript转义实际上是分步进行的。基本上意味着字符串最初被转义,但之后的结果再次被转义。所以第一次逃跑是这样的: 第1步:[“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

试图获得JSON.parse的句柄,并且很难理解转义字符是如何处理的;具体而言——为什么:

JSON.parse('["\\\\\\"\\"a\\""]')
评估:

["\""a""]
多个反斜杠如何相互作用


谢谢

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

第1步:
[“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

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

第二步:
[“\\\”\“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)
def转义(str):
str=str.replace('\\','\\\').replace(''''','\\').replace('\n','\\n')。
替换('\t','\\t')
结果=[]
对于CHIN str:
n=ord(ch)
如果n<32:
h=十六进制(n)。替换('0x','')
结果+=['\\u%s%s'('0'*(4-len(h)),h)]
其他:
结果+=[ch]
返回“”。加入(结果)

首先,让我们澄清我们实际使用的价值:

var str = '["\\\\\\"\\"a\\""]';
console.log(str);
// => ["\\\"\"a\""]
如您所见,这些反斜杠中有一半与JSON无关。它们只是在JavaScript字符串中转义字符。该字符串的实际字符如下所示:

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

\\\\“\'a\”
现在,为了弄清楚这个JSON将反序列化为什么JavaScript字符串,让我们将其分解为几个部分:

\\\\“\'a\”
1   2   3   4   5
我已将每个反斜杠与后面的字符配对(有时,另一个反斜杠会像引号一样用反斜杠转义)。现在,对于前面有反斜杠的每个字符,我们只需删除反斜杠:

“a” 1 2 3 4 5
现在再次将其混合在一起:

“a” 它起作用了吗

var-str='[“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\”];
var array=JSON.parse(str);
log(数组[0]);
//=>\“a”
是的

另外,由于JSON和JavaScript转义的工作方式相同,您可以对原始JavaScript字符串应用相同的过程:

[“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
再次拆分:

[“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
1   2   3   4   5   6   7   8   9  10  11  12  13
您会注意到,在这种情况下,只有反斜杠被转义,这是因为在我们的JavaScript中,字符串被单引号包围,因此不必转义双引号。现在,再次删除初始反斜杠,我们得到:

[“\\\\\\\\\\\\\”“]
1   2   3   4   5   6   7   8   9  10  11  12  13
再把它挤在一起:

[“\\\\\\\\\\\\\”“]

您将认识到这是我们开始使用的原始值。

哇,感谢您提供的详细答案!这肯定有助于澄清问题。问题是用javascript标记的,而不是python。此外,
str
是一个非常糟糕的变量名选择。