2014-03-25 32 views
0

我的理解是,如果我试图将stringes引号('和“),我需要转义它们,但我无法解释以下结果,当我在Firebug中尝试相同:JSON到JavaScript转义字符查询

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转换时需要转义单引号和双引号。 感谢您的帮助

编辑: 感谢您的答复。 前两个查询已清除。所以我只需要跳过我用来包围字符串的引号(在我的情况下),并且在字符串中转义任何转义字符本身。除了这2个字符,我不需要转义任何其他字符?

我不是最终查询清楚。如果我只是之前增加”的转义字符,为什么它显示了偶数输出转义字符的。对于如

>>> 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"}" 

回答

0

所以抛出的错误,是因为字符串正在结束,所以任何其他字符都试图被解析,但不能成为。因此,错误。

因此,因为哟你用引号(“)开头,使用撇号(')不是结束字符串。它位于字符串内,因为您的字符串预计会以另一个引号结尾。

如果您想包含字符串在其中定义的相同字符,则需要将其转义。例如。 “他说:\”什么是伟大的一天\“到另一个男孩”

1

通过你的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,并获得与您开始的对象相同的对象。

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

0

不需要在单引号内使用双引号或双引号内的单引号。

你确实需要像内逃脱报价行情一样 - 这些都是有效的语法:

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

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

0

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

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

对于你遇到麻烦的最后一种行为,你并没有真正地逃避报价两次;你逃脱了逃跑角色。