JSON解析字符串文字中的双引号

3
我遇到了解析字符串中引号的问题。
var lit = '{"foo":"test \"1\"","bar":"test 2"}';

在控制台中,这会出现一个错误“未捕获的异常”。

我期望的结果是:

Object {foo: "test "1"", bar: "test 2"}

这是我的代码片段:https://jsfiddle.net/bruceradtke/kor8amm5/4/

如果我将stringify的结果分配给一个变量,然后解析该变量,它可以正常工作。但是,如果我像上面那样使用字符串字面量,它就不能正常工作。

谢谢。

我的代码:

var myobject = {};
myobject.foo = "test \"1\"";
myobject.bar = "test 2";

var sresult = JSON.stringify(myobject);
console.log('stringify=' + sresult);
// OK
var thaw = JSON.parse(sresult);
console.log( thaw);

var lit = '{"foo":"test \"1\"","bar":"test 2"}';
console.log(lit);
// Broken
var thaw2 = JSON.parse(lit);

2
这是因为您在字符串文字中有JSON。在字符串文字中,\ 是转义字符。因此,如果要生成字面上的 \,则必须将其转义为 \。但是您为什么首先要这样做呢?这只是用于测试吗? - Felix Kling
1个回答

20

请记住您正在转义两个字符串文字:一个用于声明属性,一个用于声明变量(lit)。因此,您需要转义您的转义字符:"test \\"1\\""

var lit = '{"foo":"test \\"1\\"","bar":"test 2"}';
console.log(lit);

var thaw2 = JSON.parse(lit);


这是正确的。+1 更新了 OP 的 JSFiddle,以帮助他/她:https://jsfiddle.net/kor8amm5/5/ - Seamus
@StriplingWarrior 我遇到了类似的问题,你的解决方案对我很有效。然而,我还是没有完全明白为什么我们要转义两个字符串文字。 - Leandro Caplan
1
@LeandroCaplan:这是因为在字符串字面值中嵌套了另一个字符串字面值。原始字符串是 test "1"。表示该字符串的字符串字面值是 "test \"1\""(通过在引号前加上反斜杠来转义引号)。表示_那个_字符串的字符串字面值可以是 "\"test \\\"1\\\"\""(通过在引号和反斜杠字符前加上反斜杠来转义)。我们可以通过使用单引号来避免上次转义双引号,但这并不能阻止我们需要转义反斜杠:'"test \\"1\\""' - StriplingWarrior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接