PHP 的json_encode 生成一个字符串,但它是内存中的实际字符串,而不是 PHP 语法中的字符串,所以当echoed 时它没有用引号括起来。当回显到 JavaScript 代码的上下文中时,它会打印出完全有效的 JSON,但 JS 解释器不会将其视为字符串,因为它没有用引号括起来。没有它们,JS 会看到一个用文字语法表示的数组(因为 JSON 从 JS 文字语法的子集借用了它自己的语法)。因此,尝试解析它会引发错误。
如果您的代码运行,这就是输出源中实际显示的内容:
<script>
var obj = ["test123", "test456"];
</script>
由于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。
(注意: 但是,简单地用单引号括起来并不安全,因为 PHP 编码的结构可能有一个字符串,其中包含一个单引号。这会导致语法错误你的 JavaScript。)
正如已经提到的,这些都不是必需的——您可以将未引用的 JSON 交给 JS 并跳过解析,因为 JS 解释器会按原样解析它并为您节省一步。我只是想让你了解机制。希望我没有让你感到困惑...... :(
JavaScript 是唯一一种将 JSON 直接输出到上下文中的语言,这使得它不再是字符串,实际上可以产生一些可行的东西。这是因为 JSON 语法借鉴了 JavaScript 文字语法的子集。
上下文就是其中的一切。例如,通过 AJAX 将 JSON 发送到 JavaScript 与您显示的尝试为 JavaScript 提供一些 JSON 的上下文不同。在 AJAX 的情况下,服务器对 AJAX 代码的响应已经是内存中的 JS 字符串。而将 PHP 回显到 JS 代码中会产生用于 JS 引擎解析的语法,因此需要引号将其变为字符串。