我的理解是,如果我尝试对引号进行字符串化('和"),我需要逃避它们但是当我尝试相同的时候我无法解释以下结果在萤火虫中:
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转换时我需要何时以及如何转义单引号和双引号。 谢谢你的帮助
编辑: 谢谢你的回复。 前两个查询很清楚。所以我只需要转义我用来封装字符串的引号(在我的情况下")并转义字符串中的任何转义字符本身。除了这两个,我不需要逃避任何其他的角色?
我不清楚上次查询。如果我只是在'之前增加转义字符,为什么它会在输出中显示偶数个转义字符。例如
>>> 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"}"
解释器在外部添加双引号而不进行任何必要的转义以使结果成为有效的字符串文字,所以这实际上试图说的是表达式的结果是包含{的字符串{1}}(其中每个字符都是字面的,包括反斜杠)。如果您要将其写为JavaScript字符串文字,则它将是以下之一:
{"foo":"a\"a'a"}
"{\"foo\":\"a\\\"a'a\"}"
上面的字符串完全相同,它们只是根据使用的外部引用而有所不同。您应该能够将这些字符串中的任何一个传递给'{"foo":"a\\"a\'a"}'
,并获得与您开始时相同的对象。
希望这也有助于澄清为什么单引号没有被转义,如上所示你只需要转义用于字符串文字的引用类型(如果是双重转义内部双引号)引号括在字符串周围,当单引号在字符串周围时转义内部单引号。
答案 1 :(得分:0)
因此抛出的错误是因为字符串正在结束。因此,尝试解析后面的任何其他字符但不能。因此错误。
因为你以引号(“)开头,使用撇号(')不会结束字符串。它在字符串中,因为你的字符串应该以另一个引号结束。
如果要包含在其中定义字符串的相同字符,则需要对其进行转义。例如。 “他说:”多么美好的一天!“对另一个男孩来说,”
答案 2 :(得分: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);
...肯定会输出一个有效的对象。
答案 3 :(得分:0)
你的第一个推论是正确的;您需要转义要在最终字符串中出现的任何特殊字符(在本例中为引号)。如果你没有,那么浏览器将尝试按原样解析字符串,并且由于引号不匹配而会失败。
这与您解析字符串时出错的原因相同;解析器无法解释不匹配的引号。
对于您遇到问题的最后一次行为,您并没有真正逃避报价两次;你逃脱逃脱角色。