json_last_error_msg() 用于获取上一次 json 操作失败的具体错误提示,仅在未启用 json_throw_on_error 时有效,需在 json_decode/json_encode/json_validate 后立即调用,返回如“syntax error”等字符串。

json_last_error_msg() 用来获取上一次 JSON 操作(json_decode、json_encode 或 json_validate)失败时的具体错误提示,比只看数字错误码更直观,适合调试和用户友好的错误反馈。
什么时候必须配合 json_last_error_msg 使用
它只在未启用 JSON_THROW_ON_ERROR 时有效。也就是说,当你用的是默认行为(出错返回 false 或 null,不抛异常),就得靠它查原因:
-
json_decode($bad_json)返回null?调它看是不是语法错、UTF-8 错还是控制字符问题 -
json_encode($data)返回false?可能是含 NaN、递归引用或非法类型,它能告诉你具体哪一类 -
json_validate($str)返回false?它会说明是格式不对,还是编码损坏
基本用法:调完 JSON 函数立刻查
不能隔开调用,也不能在中间插入其他 JSON 操作,否则会被覆盖:
- ✅ 正确:
$data = json_decode($json); if ($data === null) { echo json_last_error_msg(); } - ❌ 错误:
json_decode($json1); json_decode($json2); echo json_last_error_msg();—— 显示的是 $json2 的错误,不是 $json1 的
常见返回值对照
它返回字符串,不是数字。典型结果包括:
-
"No error"—— 上次操作其实成功了(注意:不代表本次操作没出错,只是上次没留痕迹) -
"Syntax error"—— JSON 字符串引号不匹配、逗号多余、缺少括号等 -
"Malformed UTF-8 characters, possibly incorrectly encoded"—— 输入含 GBK/ISO 字符却当 UTF-8 解,或文件带 BOM -
"Maximum stack depth exceeded"—— 数据嵌套太深(比如数组/对象超过 512 层) -
"Type is not supported"(PHP 7.3+)—— 尝试 encode 资源、闭包、不可序列化对象等
兼容低版本 PHP(5.3–5.4)的写法
如果环境低于 PHP 5.5,json_last_error_msg() 不存在,可用如下简易替代:
if (!function_exists('json_last_error_msg')) {
function json_last_error_msg() {
static $msgs = [
JSON_ERROR_NONE => 'No error',
JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded',
];
$code = json_last_error();
return $msgs[$code] ?? 'Unknown error';
}
}
这样就能在老系统里获得一致的字符串错误信息,无需手动 switch。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











