如何在JSON中转义双引号


306

我正在尝试显示双引号,但它显示的是反斜杠之一:

"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\"。正确的方法是什么?

Answers:


446

尝试这个:

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

\在引号前只需一个反斜杠())。


9
@DWGuru这有没有关系的意见,这是作为描述的转义序列ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf(参数9 -字符串),它说:All characters may be placed within the quotation marks except for the characters that must be escaped然后它指定:\" represents the quotation mark character (U+0022)
mastazi

由于某些原因,这不适用于JS中的JSON.parse()。
SacWebDeveloper

32

何时何地使用\\\"。好吧,如果您像我一样,当您发现此线程后意识到自己在做什么时,您会感到和我一样愚蠢。

如果您要制作一个.json文本文件/流,并从那里导入数据,那么主流的答案就是双引号前的一个反斜杠:这\"就是您要查找的。

但是,如果您像我一样,并且尝试使w3schools.com“ Tryit编辑器”在JSON.parse(text)的输出中具有双引号,那么您要查找的是三重反斜杠双引号\\\"。这是因为你的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字符串。


此解决方案有助于Swift版本构建一个字符串,该字符串已添加到JSON POST的参数中。
Nick N

18

它显示的是反斜杠,因为您还转义了反斜杠。

除了双引号之外,如果要在JSON引号字符串中包含一个反斜杠,则还必须转义反斜杠。但是,如果您打算在转义序列中使用反斜杠,显然您不应该转义它。


9

请注意,这种情况最常发生在内容已被“双重编码”时,这意味着编码算法被意外调用了两次。

第一次调用将对“ text2”值进行编码:

发件人: Heute startet unsere Rundreise“示例文本”。Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

TO:取消高级Runetreise \“示例文本\”。Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

第二种编码然后再次将其转换,转义已经转义的字符:

发件人:不喜欢Runetreise的高级首字母\“示例文本\”。Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

到:取消高级Runetreise,\\“示例文本\\\”。Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

因此,如果您在这里负责服务器的实现,请检查以确保没有两个步骤尝试对相同的内容进行编码。


6
我相信,编码器也将难逃逃生开关,所以我想你第二个TO:应改为:“HEUTE startet unsere Rundreise \\\”示例文本\\\” Jeden标签wird EIN的Neues Reiseziel angesteuert双世界投资报告。
乔纳森眉

1
@Jonathan Mee:只是根据您的建议编辑了答案。理论上,它使用3个反斜杠正确编写,但是stackoverflow也使用反斜杠进行引用并将第一个2个反斜杠转换为一个反斜杠
huha

5

如果要转义JSON中的双引号,请使用\\对其进行转义。

示例,如果您想创建以下javascript对象的json

{time: '7 "o" clock'}

那么你必须按照以下方式写

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

如果我们使用解析 JSON.parse()

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

结果将是

{time: "7 "o" clock"}

1

为了避免反斜杠导致JSON数据出现问题,我使用了此功能。

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

6
我鼓励程序员对内容进行编码,而不是删除(或“清理”)内容。曾经有过“清理”数据库数据的想法-尤其是删除单引号(')。程序员没有意识到人们不能使用自己的姓氏(O'Doul)。我希望当今的程序员可以使用其他方式将原始内容获取到数据库中,而不会剥离或清除数据。
DanBaker

好吧,我删除了字符剥离部分来安抚群众。@DanBaker请记住,剥离字符文本可能是使JS在客户端应用程序中安全的唯一方法。因此,默认情况下,Angular会清理HTML输出。
mbokil '16

我同意100%的情况是必须清理数据……而XSS就是其中之一。感谢您指出这一点。
DanBaker

0

对于那些想要使用开发人员powershell的人。以下是添加到settings.json中的行:

"terminal.integrated.automationShell.windows": "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "-noe",
    "-c",
    " &{Import-Module 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell b7c50c8d} ",
    ],
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.