json_encode返回null需立即用json_last_error()和json_last_error_msg()定位错误,常见原因包括非utf-8字符串、资源句柄、循环引用、不可序列化对象或非法键名。

json_encode 返回 null 怎么快速定位原因
不是数据“看起来正常”就一定能编码成功。json_encode 对输入类型极其苛刻,静默失败是常态。返回 null 时,必须立刻检查 json_last_error() 和 json_last_error_msg(),不能只靠肉眼判断。
- 常见触发点:字符串含非 UTF-8 字节(如 GBK 中文)、数组键名含非法字符(空格、控制符)、值中混入
resource(如未关闭的文件句柄)、对象含不可访问的私有属性且未实现JsonSerializable - 中文乱码或空值?先用
mb_check_encoding($str, 'UTF-8')验证,再用mb_convert_encoding($str, 'UTF-8', 'GBK')转换 - 从数据库读取的字段含反斜杠?
stripslashes()再传入,尤其旧版 MySQL 驱动容易自动转义 - 不确定结构是否合规?用
var_dump(gettype($val), $val)看真实类型,别信print_r的表象
json_decode 解析失败但没报错,怎么排查
json_decode 只要遇到语法或编码问题,一律返回 null,不抛异常也不提示具体哪错了。你看到 null,第一反应不该是重试,而是验证原始字符串本身。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 先
trim($json)去首尾空白——BOM 头(\xEF\xBB\xBF)、换行、制表符都可能导致解析中断 - 检查是否用了单引号:
'{"key": "value"}'是非法 JSON,标准只认双引号;尾随逗号({"a":1,})也非法,哪怕 PHP 7.4+ 仍不支持 - 从 curl 或文件读取时,加一句
echo bin2hex(substr($json, 0, 6));看前几个字节,确认无 BOM - 想强制返回数组?第二个参数必须显式传
true,否则默认返回stdClass对象,$obj->key访问失败时别怪函数,怪自己没设对参数
中文被转成 \uXXXX 怎么保留原文
这是默认行为,不是 bug。PHP 5.4+ 后,json_encode 会把非 ASCII 字符 Unicode 转义。要显示原文,得加选项。
- 确保源字符串已是 UTF-8 编码(
mb_check_encoding($str, 'UTF-8')返回 true) - 调用时带上
JSON_UNESCAPED_UNICODE:json_encode($data, JSON_UNESCAPED_UNICODE) - 别漏掉其他常用组合,比如同时避免斜杠转义:
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES - 注意:这个选项在 PHP 5.4+ 才有效,低版本只能靠前端或额外处理
大 JSON 数据内存爆掉怎么办
json_encode 和 json_decode 是全量加载模型,整个结构必须一次性进内存。遇到几 MB 以上的 JSON,很容易 OOM。
- 没有流式 API,别指望边读边解——PHP 原生不支持
- 能拆就拆:后端提前分页或分段返回,避免一次塞 10 万条记录进一个数组再
json_encode - 真要处理超大 JSON,考虑用
jsonlint命令行工具预校验,或改用 C 扩展如jsond(需自行编译安装) - 临时缓解:增大
memory_limit是下策,治标不治本;更关键的是检查数据源头——是不是把二进制 blob 字段也塞进 JSON 了?
htmlspecialchars 编码过,解出来还是 HTML 实体。这些不会报错,但结果完全不对。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










