JSON转JavaScript转义字符查询

JSON to JavaScript escape character Query

本文关键字:查询 转义字符 JavaScript JSON      更新时间:2023-09-26

我的理解是,如果我试图将引号('和")字符串化,我需要转义它们,但是当我在firebug中尝试相同时,我无法解释以下结果:

1. >> JSON.stringify({foo: "a"a'a"});
SyntaxError: missing } after property list

推断:这是预期的,因为我没有转义"和'

2 >>> JSON.stringify({foo: "a'"a'a"});
 "{"foo":"a'"a'a"}"

推理/问题:JSON字符串是否也会在"之前显示转义字符,以及为什么不转义单引号

当我试图解析上面生成的输出字符串返回到JS对象时,JSON也会抛出错误?

>>> JSON.parse("{"foo":"a'"a'a"}")
SyntaxError: missing ) after argument list

最后解释下面的结果:基本上,如果我转义一次单引号,它不会显示在输出字符串中,但如果我转义两次,它会

>>> JSON.stringify({foo: "a'"a''a"});
"{"foo":"a'"a'a"}"
>>> JSON.stringify({foo: "a'"a'''a"});
"{"foo":"a'"a'''a"}"

基本上,我试图了解何时以及如何在转换到JSON时需要转义单引号和双引号。谢谢你的帮助

编辑:谢谢你的回复。前两个查询很清楚。因此,我只需要转义用于括住字符串的引号(在我的例子中是"),并转义字符串中的转义字符本身。除了这两个字符,我不需要转义其他字符?

我不清楚最后一个查询。如果我只是增加'之前的转义字符,为什么它在输出中显示偶数个转义字符。例如

 >>> JSON.stringify({foo: "a'"a''a"});
"{"foo":"a'"a'a"}"
>>> JSON.stringify({foo: "a'"a'''a"});
"{"foo":"a'"a'''a"}"
>>> JSON.stringify({foo: "a'"a''''a"});
"{"foo":"a'"a'''a"}"

JavaScript解释器给出的格式在输出以下内容时有点误导:

2 >>> JSON.stringify({foo: "a'"a'a"});
 "{"foo":"a'"a'a"}"

解释器在外部添加双引号而不做任何必要的转义以使结果成为有效的字符串字面量,因此这实际上试图说的是表达式的结果是包含{"foo":"a'"a'a"}的字符串(其中每个字符都是字面量,包括反斜杠)。如果你要把它写成一个JavaScript字符串字面值,它会是下面的一个:

  • 带双引号:"{'"foo'":'"a'''"a'a'"}"
  • 带单引号:'{"foo":"a''"a''a"}'

上面的字符串是完全相同的,它们只是根据使用的外部引号表示不同。您应该能够将这些字符串中的任何一个传递给JSON.parse并获得与您开始时相同的对象。

希望这也有助于澄清为什么单引号不转义,如上所示,您只需要转义用于字符串文字的引号类型(因此,如果双引号包围字符串,则转义内部双引号,当单引号围绕字符串时,则转义内部单引号)。

因此抛出错误是因为字符串正在结束。因此,尝试解析后面的任何其他字符,但无法解析。因此出现了错误。

因此,因为您以引号(")开始,所以使用撇号(')并不是结束字符串。它在字符串内,因为您的字符串希望以另一个引号结束。

如果您想包含与定义字符串的字符相同的字符,则需要对其进行转义。如。他说:"多么美好的一天!" to the other boy"

不需要转义双引号里面的单引号,或者单引号里面的双引号。

你需要像引号一样在引号里转义——这些都是有效的语法:

var a = "Testing '1234'";
var b = 'Testing "1234"';
var c = "Testing '"1234'"";
var d = 'Testing ''1234''';

第二部分,关于JSON字符串化,你在这里看到输出的双引号:

JSON.stringify({foo: "a'"a'a"});
  "{"foo":"a'"a'a"}"

只是您正在使用的控制台或repl中的输出。从技术上讲,这些应该作为单引号输出。

无论如何……

var s = JSON.stringify({foo: "a'"a'a"});
JSON.parse(s);

你的第一个推论是正确的;您需要转义希望出现在最终字符串中的任何特殊字符(在本例中为引号)。如果不这样做,那么浏览器将尝试按原样解析字符串,并且会因为引号不匹配而惨败。

这和你解析字符串时得到错误的原因是一样的;解析器不能解释不匹配的引号。

对于您遇到问题的最后一个行为,您并没有真正转义引号两次;您正在转义转义字符