繁体   English   中英

JSON到JavaScript转义字符查询

[英]JSON to JavaScript escape character Query

我的理解是,如果我想对引号('和“)进行字符串化处理,则需要转义它们,但是在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"}的字符串{"foo":"a\\"a'a"} (其中每个字符都有文字,包括反斜杠)。如果您打算将其编写为JavaScript字符串文字,则应为以下内容之一:

  • 用双引号引起来: "{\\"foo\\":\\"a\\\\\\"a'a\\"}"
  • 用单引号引起来: '{"foo":"a\\\\"a\\'a"}'

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

希望这也有助于澄清为什么不对单引号进行转义,如上所示,您只需要对用于字符串文字的引号类型进行转义(因此,如果双引号将字符串引起来,请转义内部双引号,并在单引号引起来时转义内部的单引号)。

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

因此,因为您以引号(“)开头,所以使用撇号(')不会结束字符串。它在字符串内,因为您的字符串应该以另一个引号结尾。

如果要包含与定义字符串相同的字符,则需要对其进行转义。 例如,他对另一个男孩说:“今天真好!”

无需在双引号内转义单引号,或在单引号内转义双引号。

您确实需要在相同的引号内转义相同的引号-这些都是有效的语法:

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);

...肯定会输出有效的对象。

您的第一个推论是正确的; 您需要转义要出现在最终字符串中的任何特殊字符(在这种情况下为引号)。 如果您不这样做,那么浏览器将尝试按原样解析字符串,并且由于引号不匹配而导致失败。

这与解析字符串时出错的原因相同; 解析器无法解释不匹配的引号。

对于您遇到的最后一种行为,您实际上并没有两次将引号转义。 您正在转义转义字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM