由于JSON格式指定不应对单引号进行转义,因此如果您在其中包含转义单引号,则大多数库(甚至本机JSON解析器)都将失败。现在这通常不是问题,因为大多数时候你做一个XHR来获取一些格式化为JSON的数据,你使用包含你可以解析的JSON字符串的responseText等。
在这种特殊情况下,我有一个JSON字符串存储在数据库中作为文本...所以数据库包含类似{"property":"value"}
的内容,我想将其作为服务器创建的HTML页面的一部分输出该页面中的JavaScript代码如下所示:
var x = '{"property":"value"}';
现在,如果数据库中的JSON字符串包含如下所示的单引号:
{"property":"val'ue"}
然后我需要逃避它,否则我将永远无法将其用作字符串:
console.clear();
var obj = {prop:"val'ue"};
var str = JSON.stringify(obj);
console.log("JSON string is %s",str);
console.dir(JSON.parse(str)); //No problem here
//This obviously can't work since the string is closed and it causes an invalid script
//console.dir(JSON.parse('{prop:"val'ue"}'));
//so I need to escape it to use a literal JSON string
console.dir(JSON.parse('{"prop":"val\'ue"}'));
那么问题是为什么{"prop":"val\'ue"}
不被视为有效的JSON字符串?
答案 0 :(得分:6)
在JavaScript中 - 字符串'{"prop":"val\'ue"}'
是 将JSON编码为字符串文字的正确方法。
当JavaScript解释器读取单引号字符串时,它会将\'
转换为'
。字符串的值是{"prop":"val'ue"}
,它是有效的JSON。
要创建无效 JSON字符串,您必须编写'{"prop":"val\\\'ue"}'
如果我理解正确的问题,那么您正在尝试生成JavaScript代码,该代码会将一些变量设置为您存储在数据库中的JSON字符串的解码版本。所以现在你再次编码字符串,因为将此字符串转换为JavaScript的方法是使用字符串文字,将其传递给JSON.parse()
。您可以依赖使用服务器端JSON编码器将JSON字符串编码为JavaScript字符串文字。例如:
<?php $jsonString = '{"prop":"val\'ue"}'; ?>
var myJson = JSON.parse(<?php echo json_encode($jsonString) ?>);
// Prints out:
// var myJson = JSON.parse("{\"prop\":\"val'ue\"}");
// And results: Object - { prop: "val'ue"}
但是,如果您100%确定JSON将是有效的,并且不需要额外解析/错误检查的权重 - 您可以跳过所有额外的编码并只写:
var myJson = <?php echo $jsonString; ?>
请记住,JSON毕竟是用于定义对象的有效JavaScript语法!
答案 1 :(得分:3)
根据jsonlint,它是有效的而不会逃避单引号,所以这很好:
{"prop": "val'ue"}
但这是无效的:
{"prop":"val\'ue"}
根据json.org json:
完全与语言无关,但是 使用熟悉的约定 C族的程序员 语言,包括C,C ++,C#,Java, JavaScript,Perl,Python等等 其他
因此,对于反向solidus(\),c语言中的语言约定意味着您的示例无效。
答案 2 :(得分:1)
你可能会尝试以下方法,但这很难看。
JSON.parse("{\"obj\":\"val'ue\"}");
或者首先将字符串存储到var中。这不应该存储文字反斜杠值,因此JSON解析器应该可以工作。
var str = '{"obj" : "val\'ue"}';
JSON.parse(str);