[英]JSON.parse with escape characters
試圖處理 JSON.parse 並且很難理解轉義字符是如何處理的; 特別是 - 為什么:
JSON.parse('["\\\\\\"\\"a\\""]')
評估為:
["\""a""]
多個反斜杠如何相互配合?
謝謝!
首先,讓我們澄清一下我們實際使用的值是什么:
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"
是的!
PS 因為 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\""]
您會認識到這是我們開始時的原始值。
在這種情況下,JavaScript 轉義實際上是分步進行的。 基本上意味着字符串最初被轉義,但之后的結果再次被轉義。 所以第一個逃生行為是這樣的:
第 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.