最可靠的方法是用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 错误,导致误判为非法。
- 建议在检测前确保字符串为 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免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











