json_validate() 仅语法校验,返回 bool,不解析不报错;参数:$json(必需 UTF-8 字符串)、$depth(默认512)、$flags(仅支持JSON_INVALID_UTF8_IGNORE);失败后用 json_last_error() 查原因;勿与 json_decode() 连用以防重复解析。

直接用 json_validate() 就行,传字符串进去,返回 true 或 false —— 它不解析、不报错、不建数组,只做语法扫描,比 json_decode() 快且省内存。
参数怎么传:必须是 string,可选 depth 和 flags
json_validate() 接收三个参数,但只有第一个是必需的:
-
$json:必须是 UTF-8 编码的string;传null、array或非 UTF-8 字符串会触发TypeError或行为未定义 -
$depth:最大嵌套深度,默认512,必须是 1–2147483647 之间的整数,超范围抛ValueError -
$flags:目前仅支持JSON_INVALID_UTF8_IGNORE,其他值(如JSON_THROW_ON_ERROR)会抛ValueError
示例:
json_validate('{"user":{"id":1}}'); // true
json_validate('{"user":{"id":1}}', 10); // true,深度限制为 10
json_validate('{"name":""}', 512, JSON_INVALID_UTF8_IGNORE); // true,跳过非法 UTF-8 字节
验证失败后怎么查原因:用 json_last_error() 和 json_last_error_msg()
json_validate() 不抛异常,只返回 false,但错误细节和 json_decode() 共享同一套状态机:
立即学习“PHP免费学习笔记(深入)”;
- 调用
json_validate($bad)返回false后,立刻调用json_last_error()可得错误码(如JSON_ERROR_SYNTAX) -
json_last_error_msg()返回对应中文/英文提示,比如"Syntax error"或"Unexpected end of input" - 注意:只要中间调用了任何其他 JSON 函数(如
json_encode()),状态就会被覆盖,必须紧接在json_validate()后读取
示例:
$bad = '{"id":}';
json_validate($bad);
var_dump(json_last_error()); // int(4) → JSON_ERROR_SYNTAX
var_dump(json_last_error_msg()); // string(13) "Syntax error"
别在 json_decode() 前硬套一层:重复解析很亏
这是最容易踩的坑:如果后续一定调用 json_decode(),就别先用 json_validate() —— 它会白跑一遍解析逻辑,性能反而更差。
-
json_decode($str, null, 512, JSON_THROW_ON_ERROR)本身已包含完整语法校验,且能直接返回数据 -
json_validate()的价值场景是:只关心“是不是合法 JSON”,但不打算立即解析(比如 API 入口守门、日志批量预检、配置文件加载前快速过滤) - 若需同时验证 + 解析,推荐直接用
json_decode()加异常捕获,或封装成函数统一处理
反例(不推荐):
if (json_validate($input)) {
$data = json_decode($input, true); // 重复扫描,浪费 CPU 和内存
}
真正省资源的用法,是它独立存在:比如收到一批缓存里的 JSON 片段,只筛出合法的再批量处理,中间不碰 json_decode()。



















