javascript - 如何使用 JSON 文字字符串?

标签 javascript json

由于 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/

相关文章:

javascript - 单击导航栏按钮时标题不展开

javascript - 解析 HTML 和 Javascript 中的 JSON 响应

json - 如何解码可以是字符串 * 或 * 字符串数组的不一致 JSON 字段?

json - jq JSON 处理缺少的字段

javascript - 根据自定义排序顺序数组对 JSON 进行排序

javascript - jquery-tokeninput 字符串参数

javascript - typescript 计算数组中的重复项并按每个项目的计数对结果进行排序

javascript - 为什么在 Nodejs 中比较两个字符串时 '===' 比逐字符比较慢

java - 使用 Jackson ObjectMapper 将 Json 的一部分转换为 HashMap

javascript - JavaScript 中的 JSON 转换