<script>
JSON.parse(<?php echo json_encode(array('test123', 'test456')); ?>);
</script>
我得到了这个错误:
语法错误:JSON.parse:在JSON数据之后出现意外的非空白字符。
<script>
JSON.parse(<?php echo json_encode(array('test123', 'test456')); ?>);
</script>
PHP的json_encode
函数可以生成一个字符串,但是它实际上是存在内存中的字符串,而不是 PHP 语法中的字符串,因此在使用 echo
输出时并没有被引号包裹。当输出到 JavaScript 代码环境中时,它打印出的是完全有效的 JSON,但是 JavaScript 解释器不会将其作为字符串看待,因为它没有被引号包裹。没有引号的话,JavaScript 将会把它视为用字面语法表示的数组(因为 JSON 借用了其子集的 JS 字面语法)。因此,尝试解析它将会抛出错误。
如果您的代码运行,则以下内容将实际显示在输出源中:
<script>
var obj = ["test123", "test456"];
</script>
obj
现在包含了许多JS文本语法。使用 JSON.parse
解析它将会导致错误。<?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引擎解析期间将一些东西解释为字符串。如果您像这样使用单引号包装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字面语法的子集借鉴而来。
上下文是关键。例如,将JSON通过AJAX发送到JavaScript与您尝试将JSON提供给JavaScript的上下文是不同的。在AJAX的情况下,服务器对AJAX代码的响应已经是JS字符串了。而将PHP回显到JS代码中会生成需要由JS引擎解析的语法,因此需要引号使其成为字符串。
json_encode
的输出周围。JSON的内容可能包含一个单引号,当打印时会提前终止字符串。如果你要将其包装在字符串中,你需要先转义任何单引号。 - Colin MJSON已经是有效的JavaScript,因此在这里不需要使用JSON.parse
。以下内容应该可以正常工作:
<script>
var obj = <?php echo json_encode(array('test123', 'test456')); ?>;
</script>
<script>
var obj = ["test123", "test456"];
</script>
直接回答: 由于上述并没有技术性地回答你的问题,JSON.parse
旨在处理字符串。你没有给它一个字符串,而是给了它一个对象(因为JSON是有效的JavaScript)。如果你实际上将值放在单引号中,则JSON.parse
应该可以正常工作,但你需要确保它被正确转义(单引号内部的单引号会导致问题)。但在这种情况下,我建议避免将JSON作为字符串处理,因为这是不必要的。json_encode
字符串运行JSON.parse
呢?此外,它为什么还有效? - Recovering NerdaholicJSON.parse
(浏览器不会自动执行此操作)。然而,当您从PHP中使用echo
输出某些内容时,就浏览器而言,这与在页面上硬编码var obj = ['test123', 'test456'];
是相同的。它不知道它来自您的PHP脚本。 - Colin M我认为你需要将 PHP 输出放在引号 "" 中间
试试这个:
<script>
JSON.parse("<?php echo json_encode(array('test123', 'test456')); ?>");
</script>