簡體   English   中英

帶有轉義字符的 JSON.parse

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM