最可靠的方法是用json_decode()配合json_last_error()判断,或PHP 7.3+启用JSON_THROW_ON_ERROR异常模式;需注意null合法、空字符串非法、UTF-8编码要求及深度限制。

PHP检测JSON是否合法,最可靠的方法是用 json_decode() 配合 json_last_error() 判断解析结果和错误码。
使用 json_decode() + json_last_error() 检测
这是官方推荐、兼容性好、逻辑清晰的方式。核心思路是尝试解析,再检查是否出错:
-
成功解析且无错误:返回非 null 值,
json_last_error()返回JSON_ERROR_NONE -
解析失败:返回
null,且json_last_error()不为JSON_ERROR_NONE - 注意:
json_decode("null")也返回null,但它是合法JSON——所以不能只靠返回值是否为null判断,必须结合错误码
示例代码:
function isValidJson($str) {
json_decode($str);
return json_last_error() === JSON_ERROR_NONE;
}
// 测试
var_dump(isValidJson('{"name":"张三","age":25}')); // true
var_dump(isValidJson('{"name": "李四", age: 30}')); // false(缺少引号)
var_dump(isValidJson('null')); // true
var_dump(isValidJson('')); // false(空字符串非法)
处理 UTF-8 编码问题
如果输入字符串含中文但编码不是 UTF-8(如 GBK),json_decode() 会直接报 JSON_ERROR_UTF8 错误,导致误判为非法。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 建议在检测前确保字符串为 UTF-8 编码,可用
mb_convert_encoding($str, 'UTF-8', 'auto')转换 - 或先用
mb_detect_encoding()粗略判断,再转换(注意该函数不完全可靠,生产环境建议统一接口编码)
区分“语法错误”和“深度/内存限制”
超长或嵌套过深的JSON可能触发 JSON_ERROR_DEPTH、JSON_ERROR_STATE_MISMATCH 等,这些也属于“不合法”范畴,json_last_error() 同样能捕获。
- 默认最大嵌套深度为 512 层,可通过
json_decode($str, false, 512, JSON_THROW_ON_ERROR)(PHP 7.3+)让其抛异常便于调试 - 若需自定义限制,可传入第3个参数(depth),但一般无需改动
简洁写法(PHP 7.3+)
启用异常模式更直观:
function isValidJson($str) {
try {
json_decode($str, flags: JSON_THROW_ON_ERROR);
return true;
} catch (Exception $e) {
return false;
}
}
这种方式避免手动查错误码,语义更明确,推荐新项目使用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










