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