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