【问题标题】:JSON to JavaScript escape character QueryJSON到JavaScript转义字符查询
【发布时间】:2014-03-25 02:50:37
【问题描述】:

我的理解是,如果我试图对引号('和“)进行字符串化,我需要对它们进行转义,但是当我在 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 json escaping


    【解决方案1】:

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

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

    解释器在外部添加双引号而没有进行任何必要的转义以使结果成为有效的字符串文字,所以这实际上想说的是表达式的结果是包含@的字符串987654322@(其中每个字符都是文字,包括反斜杠)。如果你打算把它写成 JavaScript 字符串文字,它会是以下之一:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-03-16
            • 2011-07-01
            • 2013-04-15
            • 1970-01-01
            • 1970-01-01
            • 2018-01-20
            • 1970-01-01
            • 2018-02-06
            • 2022-01-03
            相关资源
            最近更新 更多