2013-03-26 163 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"}