json_last_error()用于获取上一次json操作的错误码,须在json_encode()/json_decode()/json_validate()后立即调用;常见错误包括json_error_syntax(语法错)、json_error_utf8(编码错)等,需结合json_last_error_msg()使用并遵循闭环检查与预防实践。

PHP中处理JSON时出错,光看json_decode()或json_encode()返回false是不够的——真正定位问题靠的是json_last_error()返回的具体错误码。
json_last_error() 的作用和调用时机
这个函数不接收任何参数,只返回上一次调用json_validate()、json_encode()或json_decode()时发生的最后一个错误编号。它不是实时检测器,而是“错误快照”,必须在JSON操作之后**立即**调用,否则可能被后续JSON操作覆盖。
- 不能在多次JSON调用之间隔开其他逻辑再查错
- 若启用了
JSON_THROW_ON_ERROR选项,函数不会触发错误码(而是抛出JsonException),此时json_last_error()仍可能残留旧值,不可依赖 - 推荐搭配
json_last_error_msg()一起用,获得可读性更强的错误描述
常见错误码含义与典型场景
每个错误码对应一类底层问题,理解它们能快速缩小排查范围:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
JSON_ERROR_SYNTAX:最常见。JSON字符串格式非法,比如末尾多逗号、单引号代替双引号、未转义的换行符或内部双引号(如
"msg": "他说"你好"") - JSON_ERROR_UTF8:输入字符串含非法UTF-8字节,常出现在GBK/GB2312编码的中文混入、curl获取响应未转码、数据库字段编码不一致时
- JSON_ERROR_DEPTH:嵌套层级超限(默认128层),多见于循环引用对象或极端复杂的数组结构
- JSON_ERROR_RECURSION:待编码的变量中存在自我引用(如对象属性指向自身),PHP无法序列化
-
JSON_ERROR_INF_OR_NAN:数值为
INF、-INF或NAN,JSON标准不支持这些特殊浮点值 - JSON_ERROR_UNSUPPORTED_TYPE:尝试编码资源(resource)、闭包(closure)或某些GMP对象等不支持类型
实用错误处理模式
不要只判断返回值是否为false,要形成闭环检查习惯:
- 对
json_encode():检查返回值是否=== false,再调用json_last_error()确认原因 - 对
json_decode():不能仅用== null判断失败,因为合法JSON也可能解码为null;应先检查返回值是否=== false,再结合错误码区分是语法错还是原始数据就是null - 对
json_validate():它本身返回布尔值,但验证失败后仍可调用json_last_error()获取具体错误类型,便于日志归类 - 生产环境建议统一封装JSON操作函数,在内部自动记录错误码+消息+原始数据片段(脱敏后)
规避错误的几个关键实践
很多错误其实在编码前就能预防:
- 确保所有待编码字符串已转为UTF-8(可用
mb_convert_encoding($str, 'UTF-8', 'auto')) - 避免直接
json_encode()用户提交的原始文本;先过滤控制字符(如preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $input)) - 对数值字段做
is_finite()校验,排除INF/NAN - 使用
JSON_INVALID_UTF8_IGNORE或JSON_INVALID_UTF8_SUBSTITUTE选项容忍轻微编码瑕疵(PHP 7.2+) - 升级到PHP 8.1+后,注意
JSON_ERROR_NON_BACKED_ENUM——枚举未声明BackedEnum接口时无法编码
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










