PHP的json_encode生成一个字符串,但它是内存中的实际字符串,而不是PHP语法中的字符串,因此在回显时它不会包含在引号中.当回显到JavaScript代码的上下文中时,它会打印出完全有效的JSON,但JS解释器不会将其视为字符串,因为它不包含在引号中.没有它们,JS会看到一个用文字语法表示的数组(因为JSON从JS文字语法的子集中借用了自己的语法).因此,尝试解析它会引发错误.
如果你的代码运行了,这就是输出源中实际显示的内容:
var obj = ["test123", "test456"];
由于obj现在拥有一个数组(用JS文字语法表示),通过JSON.parse运行它会导致错误.
把它想象成你在PHP中用字符串写的句子,然后回应:
$sentence = 'I like beer.':
echo $sentence;
?>
这会产生输出:
I like beer.
请注意没有包装报价.现在,想象一下“手动”编写一大块JSON并回应它:
$json = '{"foo": "bar"}':
echo $json;
?>
这将输出:
{"foo": "bar"}
再次注意没有包装报价.对变量$json的赋值在PHP中生成与调用json_encode相同的字符串数据.因此,回应您的通话输出也会导致没有报价.
现在,看看最后一个输出块 – 如果遇到类似的事情,JavaScript引擎会怎么做?
因此,要使用JSON.parse进行解析,您需要JS在JS引擎的解析期间将其解释为字符串.如果您将PHP包装在单引号中:
var obj = '<?php echo json_encode(array('test123', 'test456')); ?>';
然后输出将是:
var obj = '["test123", "test456"]';
由于这是一个格式正确的字符串,现在它是JSON,可以传递给JSON.parse.
(注意:简单地用单引号括起来并不安全,因为PHP编码的结构可能包含一个包含单引号的字符串.这会导致JavaScript中出现语法错误.)
正如已经提到的那样,无论如何都不需要这样做 – 你可以将JS提交给非引用的JSON并跳过解析,因为JS解释器将按原样解析它并为您节省一步.我只是想让你了解这些机制.希望我没有混淆你…… 🙁
JavaScript是唯一一种将JSON直接输出到上下文中的语言,这使得它不再是一个字符串,实际上可以生成一些可行的东西.这是因为JSON语法借用了JavaScript文字语法的一个子集.
语境就是这一切.例如,通过AJAX将JSON发送到JavaScript与您尝试向JavaScript提供一些JSON时显示的上下文不同.在AJAX的情况下,服务器对AJAX代码的响应已经是内存中的JS字符串.而将PHP回显到JS代码中会产生JS引擎解析的语法,因此需要引号使其成为字符串.