json_encode() 默认将中文转为\uXXXX是因遵循JSON规范,加JSON_UNESCAPED_UNICODE可保留原样;PHP 5.4+支持该标志,需确保数据为UTF-8编码,否则返回false。

直接用 json_encode() 就行,但默认行为在中文、空数组、布尔值等场景下容易出错——关键不是会不会调,而是怎么调对。
为什么 json_encode() 会把中文变成 Unicode?
PHP 默认将非 ASCII 字符(比如中文)转成 \uXXXX 形式,这是 JSON 规范允许的,但前端读起来不直观,调试也费劲。
- 加
JSON_UNESCAPED_UNICODE标志即可保留原样:json_encode($data, JSON_UNESCAPED_UNICODE) - 如果 PHP 版本
- 注意:如果源数据本身是 GBK 编码(极少见),先
mb_convert_encoding($data, 'UTF-8', 'GBK')再 encode
空数组被编码成对象 {} 而不是 []
PHP 的“关联数组”和“索引数组”在 json_encode() 中表现不同:只要键名不全是连续数字,就视为对象。空数组 [] 如果是通过 array('a' => 1) 这类方式构造后清空,内部结构可能仍被识别为关联型。
- 最稳妥办法是显式重置键:
json_encode(array_values($arr)) - 检查是否真为空:
array_keys($arr) === range(0, count($arr) - 1)可辅助判断 - 如果业务强依赖
[],别依赖自动推断,统一用array_values()过一遍
json_encode() 返回 false 怎么排查?
返回 false 不代表没执行,而是编码失败,常见原因有三类:字符编码问题、不可序列化类型、递归引用。
立即学习“PHP免费学习笔记(深入)”;
- 先确认输入是否 UTF-8:
mb_check_encoding($data, 'UTF-8'),否则加JSON_PARTIAL_OUTPUT_ON_ERROR看是否缓解 - 过滤掉资源、闭包、
SimpleXML对象等不可序列化项,可用array_walk_recursive()预处理 - 用
json_last_error()和json_last_error_msg()拿到具体错误,比如JSON_ERROR_RECURSION表示有循环引用
真正麻烦的不是语法,而是数据源头混杂了多种编码、嵌套了对象、或者前端硬性要求某类结构——这时候光靠一个函数参数解决不了,得在 encode 前做干净的数据规整。



















