json_encode输出null的主因是输入类型不合规:非UTF-8字符串、不可序列化对象、循环引用或非法键名;中文乱码需检查编码并用JSON_UNESCAPED_UNICODE;空数组输出{}或[]取决于键名类型;大数组应分批或改用NDJSON流式处理。

json_encode 输出 null 是最常见的错误
不是数据写错了,而是 json_encode 对输入类型极其敏感:非 UTF-8 编码的字符串、含不可序列化对象(比如 SimpleXMLElement 或资源句柄)、循环引用、或者数组键名是负数/浮点数——都会静默返回 null,且不报错。
- 先用
mb_check_encoding($data, 'UTF-8')检查字符串是否真为 UTF-8;中文乱码或从数据库读出没设 charset 时极易中招 - 避免直接传
mysqli_result或PDOStatement,得先fetch_all()转成数组 - 遇到对象,确认它实现了
JsonSerializable接口,或手动用get_object_vars()提取可序列化字段 - 调试时加一句:
var_dump(json_last_error(), json_last_error_msg());,比盲猜快得多
中文被转成 \uXXXX 怎么办
json_encode 默认把所有非 ASCII 字符转义,不是 bug,是 RFC 合规行为。但前端显示或日志查看时确实难受。
- PHP 5.4+ 加上
JSON_UNESCAPED_UNICODE标志即可:json_encode($data, JSON_UNESCAPED_UNICODE) - 别混用
JSON_UNESCAPED_SLASHES之类无关标志,除非你真需要处理 HTML 中的/转义 - 注意:如果数据里混有 Latin-1 字符(比如旧 MySQL 表用
latin1_swedish_ci),即使加了该标志,仍会出null—— 编码问题优先级高于转义控制
空数组变成 {} 而不是 []
这是 PHP 的“关联数组”和“索引数组”语义导致的,json_encode 不看内容,只看键名类型。
图书《网页制作与PHP语言应用》,由武汉大学出版社于2006出版,该书为普通高等院校网络传播系列教材之一,主要阐述了网页制作的基础知识与实践,以及PHP语言在网络传播中的应用。该书内容涉及:HTML基础知识、PHP的基本语法、PHP程序中的常用函数、数据库软件MySQL的基本操作、网页加密和身份验证、动态生成图像、MySQL与多媒体素材库的建设等。
- 如果数组键全是连续数字(0,1,2…),输出
[];只要有一个字符串键(哪怕只有['a' => 1]),就输出{} - 想强制输出
[],用array_values($arr)重排键名,但注意这会丢弃原始键名语义 - 想强制输出
{},用(object)$arr转对象,但要注意对象属性不能是数字开头或含特殊字符 - 实际接口开发中,前后端约定好结构比硬改输出更重要:空列表传
[],空对象传{},别为了“看起来整齐”破坏语义
大数组内存溢出或超时
json_encode 是一次性加载全部数据进内存再编码的,几万条记录的数组很容易崩。
立即学习“PHP免费学习笔记(深入)”;
- 别在循环里反复
json_encode大数组,先array_chunk分批处理 - 对超大数据流(如导出日志),改用逐行
json_encode($line) . "\n"的 NDJSON 格式,前端用fetch().body.getReader()流式解析 - 生产环境记得检查
memory_limit和max_execution_time,但治标不治本——结构设计上就该避免单次传输全量数据
json_encode 不好用,其实是数据源头没清理干净,或者根本没想清楚要传什么过去。










