由于 JSON 格式指定不应转义单引号,如果其中包含转义的单引号,大多数库(甚至 native 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 字符串?
最佳答案
在 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 语法!
关于javascript - 如何使用 JSON 文字字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3153723/