PHP数组转JS可用对象最稳妥方法是json_encode(),但必须用引号包裹输出、避免HTML上下文破坏,并对中文、HTML标签、时间、资源等特殊值预处理,否则易报“Unexpected token”或XSS风险。

PHP数组直接变成JS可用的对象,json_encode 是最稳妥的路,但不是套上就完事——关键在引号、转义和上下文环境。
为什么 json_encode 输出的字符串在JS里报错“Unexpected token”
常见现象:把 json_encode($arr) 直接塞进 <script> 里,JS控制台报错,比如 Uncaught SyntaxError: Unexpected token '' 或解析出 undefined。
根本原因:PHP输出的是 JSON 字符串(带双引号),而 JS 脚本里没用引号包裹它,相当于写了 var data = {"name":"张三"}; ——这在语法上是非法的,JS 期望的是字面量或赋值表达式,但缺少引号会让大括号被当成代码块。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 必须用单引号或双引号包裹
json_encode的输出,例如:var data = <?php echo json_encode($arr); ?>;❌ 错误写法;应写成var data = <?php echo json_encode($arr); ?>;→ 实际要加引号:var data = <?php echo json_encode($arr); ?>;→ 正确是:var data = <?php echo json_encode($arr); ?>;(注意前后引号) - 更安全的做法是统一用
JSON.parse()+ 字符串:var data = JSON.parse('<?php echo addslashes(json_encode($arr)); ?>');,但前提是确保 PHP 输出不含未转义的单引号 - 推荐终极解法:用
json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG)避免中文乱码和 XSS 风险,再配合htmlspecialchars()输出到 HTML 属性或内联脚本中
PHP 数组含 HTML 标签或用户输入时,json_encode 会出什么问题
典型场景:从数据库读取带 <p>、"、换行符的字段,直接 json_encode 后插入 <script>,JS 解析失败或页面被 XSS 注入。
原因在于:json_encode 默认不处理 HTML 实体,且对 <、>、& 等字符不做额外编码,一旦嵌入 HTML 上下文,就会破坏 DOM 结构。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 不要把
json_encode结果直接拼进 HTML 属性(如data-json="<?php echo json_encode($arr); ?>"),容易因引号冲突崩掉 - 若必须放属性,用
htmlspecialchars(json_encode($arr), ENT_QUOTES, 'UTF-8')包一层 - 最佳实践是走
<script type="application/json">容器:<script type="application/json" id="init-data"><?php echo json_encode($arr, JSON_UNESCAPED_UNICODE); ?></script>
然后 JS 里用JSON.parse(document.getElementById('init-data').textContent)
json_encode 和前端 JSON.parse 配合时,时间、布尔、null 值要注意什么
PHP 的 null、true、false 经 json_encode 后变成 JS 原生值,没问题;但时间类型(如 DateTime 对象)默认转成空对象 {},而不是 ISO 字符串。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 时间字段务必提前格式化:
$arr['created_at'] = $date->format('c');(c是 ISO 8601 格式),否则 JS 里拿到的是空对象 - 资源类型(如 file handle、PDO 对象)无法被
json_encode,会静默转成null,需提前过滤或抛异常 - 浮点数精度:PHP 默认保留小数位数可能与 JS 不一致,敏感计算建议转成字符串再传,如
'price' => sprintf('%.2f', $price) - 避免用
JSON_NUMERIC_CHECK,它会把数字字符串(如"000123")强行转整数,丢失前导零
真正难的不是调用 json_encode,而是判断它该出现在哪、怎么被 JS 拿到、以及中间有没有 HTML 解析器插一脚。多一层上下文,就得多一重转义策略。



















