如何使用JSON文字字符串?

时间:2010-06-30 21:54:57

标签: javascript json

由于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字符串?

3 个答案:

答案 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);