如何在JSON中转义双引号

use*_*021 283 json

我试图显示双引号,但它显示了一个反斜杠:

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

在html中渲染时显示为\"Example text\".什么是正确的方法?

kam*_*uel 418

试试这个:

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

(\在引号前只有一个反斜杠()).

  • 由于某种原因,这不适用于 JS 中的 JSON.parse() 。 (10认同)
  • @DWGuru这与评论无关,它是一个转义序列,如https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf(Par.9-Strings)所述.它说:`除了必须转义的字符外,所有字符都可以放在引号内,然后指定:`\"代表引号字符(U + 0022)` (8认同)
  • @Qwerty 看来你所需要的只是双反斜杠。`'{"a":"引号\\"这里"}'` (3认同)
  • @SacWebDeveloper是的,确实如此,因为在单引号“''”内,可以使用双引号而无需转义。我有点把两件事混合在一起,我在发帖后意识到这一点。在`"`内部,仍然需要使用三重转义符,尽管`" \\\" "` vs `' \\" '`。 (3认同)
  • @SacWebDeveloper `var r = '{"a":"quotes\"here"}' // "{"a":"quotes"here"}"`。您需要的是转义字符串中的反斜杠,因此使用三个反斜杠,即。`var r = '{"a":"引号\\\"这里"}' // "{"a":"引号\"这里"}"`. 之后你可以使用`JSON.parse(r)` (2认同)
  • @Qwerty虽然有三个反斜杠,但这不是“三重转义”,它只是_两个_转义字符:一个转义的反斜杠(````\\````)后面跟着一个转义的双引号(````\" ````)。 (2认同)

Gre*_*r y 25

何时何地使用\\\".好吧,如果你像我一样,当我发现这个帖子后,当我意识到自己在做什么时,你会感觉像傻一样.

如果您正在创建.json文本文件/流并从那里导入数据,那么在双引号之前只有一个反斜杠的主流回答:\"是您正在寻找的那个.

但是,如果你像我一样,并且你想让w3schools.com"Tryit Editor"在JSON.parse(文本)的输出中有双引号,那么你要找的是三元组反斜杠双引号\\\".这是因为您在HTML <script>块中构建文本字符串,并且第一个双反斜杠在字符串变量中插入单个反斜杠,然后以下反斜杠双引号将双引号插入到字符串中,以便生成的脚本字符串包含\"from标准答案和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>
Run Code Online (Sandbox Code Playgroud)

+1:因为它是一个JavaScript文本字符串,所以双反斜杠双引号\\"也可以工作; 因为双引号不需要在单个引用的字符串中进行转义,例如'\"''"'导致相同的JS字符串.


Ale*_*den 18

它显示了反斜杠,因为你也逃避了反斜杠.

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


小智 18

太长了;博士

如果您使用的是 javascript、python 等,请使用原始字符串(pythonr''或 javascriptString.raw或类似字符串)。它们使编写 JSON 字符串变得更加容易,因为它们避免了多个转义序列处理。

console.log(JSON.parse(String.raw`"This is a double quote >> \" <<"`))
// => This is a double quote >> " <<
Run Code Online (Sandbox Code Playgroud)

更深入

在代码中编写 JSON 字符串时,一些混乱来自于多次处理的字符串转义序列。一次在编程语言中,再次在 JSON 解析器中(例如JSON.parse()在 Javascript 或类似语言中)

使用该语言的打印函数来查看编程语言中发生了什么转义

看到字符串在编程语言 repl 中的显示方式可能会令人困惑。

例如,当您直接在 javascript repl 中输入字符串时,它会以这种方式显示

'Two newlines:\n\nTab here >>\t<<\n\nBackslash here >>\\<<'
// => 'Two newlines:\n\nTab here >>\t<<\n\nBackslash here >>\\<<'
Run Code Online (Sandbox Code Playgroud)

但是当你console.log()输入字符串时,它会这样显示

console.log('Two newlines:\n\nTab here >>\t<<\n\nBackslash here >>\\<<')
/* =>
Two newlines:

Tab here >> <<

Backslash here >>\<<
*/
Run Code Online (Sandbox Code Playgroud)

当 javascript 遇到字符串时,它会在将其传递给函数之前“评估”转义序列,即它\n用换行符、\t制表符等替换每个转义序列。

console.log()所以它对字符串有很大帮助,可以更好地了解正在发生的事情。

如何在 JavaScript 中对 JSON 中的单引号进行编码

要在 javascript 中写入"JSON,您可以使用

console.log(JSON.parse('"This is a double quote >> \\" <<"'));
// => This is a double quote >> " <<
Run Code Online (Sandbox Code Playgroud)

在 python 和其他语言中也是类似的。

一步步:

  1. javascript 使用 javascript 规范中的转义序列规则评估字符串,\n用换行符、\t制表符等 替换。
    • 在我们的例子中,它替换\\\.
    • 结果字符串是"This is a double quote >> \" <<"
    • 我们添加外部双引号以使其成为有效的 JSON 字符串
  2. javascript 获取结果并将其传递给 JSON.parse() fn。
  3. JSON.parse 使用 JSON 标准中的转义序列规则评估字符串,\n用换行符、\t制表符等替换。在我们的例子中,
    • 它看到的第一个字符是",所以它知道这是一个 JSON 字符串。
    • 在 JSON 字符串中,它看到\". 通常"会结束 JSON 字符串,但因为"使用 转义\,它知道这不是字符串的结尾,并\"用文字双引号字符替换。
    • 它看到的最后一个字符是",所以它知道这是 JSON 字符串的结尾
    • 解析后的字符串为This is a double quote >> " <<. 请注意,外部双引号也消失了。

原始字符串让事情变得更容易

Javascript 的String.raw模板函数和 python 的r''字符串不执行任何转义序列评估,因此它使得推理变得更加容易且不那么混乱

console.log(JSON.parse(String.raw`"This is a double quote >> \" <<"`))
// => This is a double quote >> " <<
Run Code Online (Sandbox Code Playgroud)


man*_*nas 15

如果你想在 JSON 中转义双引号,请使用 \\ 来转义它。

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

{time: '7 "o" clock'}
Run Code Online (Sandbox Code Playgroud)

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

'{"time":"7 \\"o\\" clock"}'
Run Code Online (Sandbox Code Playgroud)

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

JSON.parse('{"time":"7 \\"o\\" clock"}')
Run Code Online (Sandbox Code Playgroud)

结果将是

{time: "7 "o" clock"}
Run Code Online (Sandbox Code Playgroud)


小智 8

请注意,这通常发生在内容被"双重编码"时,这意味着编码算法被意外地调用了两次.

第一个调用将编码"text2"值:

来自: Heute startet unsere Rundreise"示例文本".Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Heute startet unsere Rundreise \"示例文本\".Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

第二个编码然后再次转换它,转义已经转义的字符:

来自: Heute startet unsere Rundreise \"示例文本\".Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Heute startet unsere Rundreise \\\"示例文本\\\".Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

因此,如果您负责此处的服务器实施,请检查以确保没有两个步骤尝试编码相同的内容.

  • 我相信编码器也会逃脱逃生开关所以我认为你的第二个**TO:**应该是:"Heute startet unsere Rundreise \\\"示例文本\\\".Jeden Tag wird ein neues Reiseziel angesteuert bis wir . (6认同)
  • @Jonathan Mee:刚刚根据您的建议编辑了答案。理论上,使用 3 个反斜杠可以正确编写,但 stackoverflow 也使用反斜杠进行引用,并将第一个两个反斜杠转换为一个反斜杠 (2认同)

mbo*_*kil 8

为了转义导致 JSON 数据出现问题的反斜杠,我使用此函数。

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

  • 我鼓励程序员对内容进行编码,而不是删除(或“清理”)内容。曾经有一种“清理”数据库数据的想法——特别是删除单引号(')。程序员没有意识到人们不能使用自己的姓氏(O'Doul)。我希望今天的程序员使用其他方式将原始内容放入数据库而不剥离或清理数据。 (9认同)
  • 好吧,我删除了角色剥离部分以安抚大众。@DanBaker 请记住,剥离文本中的字符可能是使 JS 在客户端应用程序中安全的唯一方法。由于这个原因,Angular 默认会清理 HTML 输出。 (3认同)
  • 我 100% 同意,有时数据必须被清理……而 XSS 就是其中之一。谢谢你指出这一点。 (2认同)