php中 js不起作用,javascript – 为什么json_encode之后没有JSON.parse不起作用?

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引擎解析的语法,因此需要引号使其成为字符串.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值