如何使用JSON文字字符串?

SBU*_*OLD 12 javascript json

由于JSON格式指定不应对单引号进行转义,因此如果您在其中包含转义单引号,则大多数库(甚至本机JSON解析器)都将失败.现在这通常不是问题,因为大多数时候你做一个XHR来获取一些格式化为JSON的数据,你使用包含你可以解析的JSON字符串的responseText等.

在这种特殊情况下,我有一个JSON字符串存储在数据库中作为文本...所以数据库包含类似的东西{"property":"value"},我想将其作为服务器创建的HTML页面的一部分输出,以便该页面中的JavaScript代码看起来这样的事情:

var x = '{"property":"value"}';
Run Code Online (Sandbox Code Playgroud)

现在,如果数据库中的JSON字符串包含如下所示的单引号:

{"property":"val'ue"}
Run Code Online (Sandbox Code Playgroud)

然后我需要逃避它,否则我将永远无法将其用作字符串:

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"}'));
Run Code Online (Sandbox Code Playgroud)

那么问题是为什么{"prop":"val\'ue"}不考虑有效的JSON字符串?

gna*_*arf 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"}
Run Code Online (Sandbox Code Playgroud)

但是,如果您100%确定JSON将是有效的,并且不需要额外解析/错误检查的权重 - 您可以跳过所有额外的编码并只写:

var myJson = <?php echo $jsonString; ?>
Run Code Online (Sandbox Code Playgroud)

请记住,JSON毕竟是用于定义对象的有效JavaScript语法!