2013-03-26 124 views
213

試圖展示雙引號,但它顯示了反斜槓之一:我如何逃脫雙引號JSON

"maingame": { 
    "day1": { 
     "text1": "Tag 1", 
     "text2": "Heute startet unsere Rundreise \\\"Example text\\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> " 
    } 
} 

當HTML渲染它顯示爲\"Example text\"。什麼是正確的方法?

回答

304

試試這個:

"maingame": { 
    "day1": { 
    "text1": "Tag 1", 
    "text2": "Heute startet unsere Rundreise \" Example text\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> " 
    } 
} 
(引號中的前端只有一個反斜槓( \))

+0

單個評論不起作用 – DWGuru 2016-01-08 12:04:56

+3

@DWGuru這與評論無關,它是一個轉義序列,詳見https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404 .pdf(Par。 9 - 字符串)它說:'所有字符可能是 放置在引號內,除了必須轉義的字符,然後它指定:'\「代表引號字符(U + 0022)' – mastazi 2017-03-30 01:30:57

16

它顯示反斜槓,因爲你也逃避反斜槓。

除了雙引號,如果你想在你的JSON引用字符串中包含一個,你還必須轉義反斜槓。但是,如果你打算在轉義序列中使用反斜槓,顯然你不應該逃避它。

6

請注意,這通常發生在內容已被「雙重編碼」時,這意味着編碼算法被意外地調用了兩次。

第一呼叫將編碼 「text2」 中值:

FROM: HEUTE startet unsere Rundreise 「示例文本」。 Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

TO: Heute startet unsere Rundreise \「Example text \」。 Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

第二編碼然後再次將其轉換,逸出已經轉義字符:

FROM: HEUTE startet unsere Rundreise \ 「示例文本\」。 Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

TO: Heute startet unsere Rundreise \\\「Example text \\\」。 Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

因此,如果您負責此處的服務器實施,請檢查以確保沒有兩個步驟嘗試編碼相同的內容。

+5

我相信編碼器也會逃離轉換開關,所以我認爲你的第二個** TO:**應該是:「Heute startet unsere Rundreise \\\」Example text \\\「。 Jeden Tag wird ein neues Reiseziel angesteuert bis wir。 – 2014-11-20 17:00:41

+0

double \\對我來說很好用 – DWGuru 2016-01-08 12:05:33

+0

@Jonathan Mee:剛剛根據你的建議編輯了答案。它理論上用3個反斜槓正確書寫,但是stackoverflow也使用反斜槓進行引用,並將前兩個反斜槓轉換爲一個反斜槓 – huha 2016-09-15 08:38:56

0

爲了避免導致JSON數據問題的反斜槓,我使用這個函數。

//escape backslash to avoid errors 
var escapeJSON = function(str) { 
    return str.replace(/\\/g,'\\'); 
}; 
+2

我鼓勵程序員對內容進行編碼,而不是刪除(或「清理」)內容。過去有一種「清理」數據庫數據的想法 - 特別是刪除單引號(')。程序員沒有意識到人們不能使用他們自己的姓氏(O'Doul)。我希望今天的程序員使用其他方法將原始內容導入數據庫,而不用剝離或清理數據。 – DanBaker 2016-06-16 16:37:21

+0

好的,我刪除了字符剝離部分以安撫羣衆。 @DanBaker記住剝離字符文本可能是讓JS在客戶端應用程序中安全的唯一方法。由於這個原因,Angular默認會清理HTML輸出。 – mbokil 2016-08-09 18:50:09

+0

我同意100%有時候數據必須被消毒......並且XSS是其中一個時代。謝謝你指出一個。 – DanBaker 2016-08-10 21:54:44

10

何時何地使用\\\"來代替。好吧,如果你像我一樣,你會感覺和我在發現這個主題後意識到自己在做什麼時一樣愚蠢。

如果您正在製作.json文本文件/流並從那裏導入數據,那麼在雙引號之前只有一個反斜槓的主流答案:\"是您正在尋找的那個。

但是,如果你和我一樣,而你試圖讓w3schools.com的「Tryit Editor」在JSON.parse(文本)的輸出中有一個雙引號,那麼你正在尋找的那個因爲是三重反斜槓雙引號\\\"。這是因爲您在HTML <script>塊內構建了文本字符串,並且第一個雙反斜槓將單個反斜槓插入字符串變量,然後下面的反斜槓雙引號將雙引號插入字符串中,以便生成的腳本字符串包含\"從標準答案和JSON解析器將解析這只是雙引號。

<script> 
    var text="{"; 
    text += '"quip":"\\\"If nobody is listening, then you\'re likely talking to the wrong audience.\\\""'; 
    text += "}"; 
    var obj=JSON.parse(text); 
</script> 

+1:因爲它是一個JavaScript字符串,一個雙反斜線雙引號\\"將工作太;因爲雙引號不需要在單引號字符串內轉義,例如'\"''"'會導致相同的JS字符串。

1

如果你想逃避JSON中的雙引號使用\\來轉義它。如果你想創建這樣的JavaScript對象

{time: '7 "o" clock'} 

則必須在以下方式

'{"time":"7 \\"o\\" clock"}' 

寫的JSON,如果我們分析使用JSON.parse()

JSON.parse('{"time":"7 \\"o\\" clock"}') 

結果它

例子將是

{time: "7 "o" clock"}