在PHP开发中,处理JSON数据是常见需求,如果传入的JSON字符串格式不符合规范,后续调用json_decode解析时可能返回null,且无法直观判断是格式错误还是数据本身为null,因此提前验证JSON格式是否正确非常有必要。本文会介绍几种PHP中验证JSON格式的方法,开发者可以根据实际场景选择使用。

方法一:使用json_validate函数(PHP 8.3及以上版本)
PHP 8.3版本新增了json_validate内置函数,专门用于验证字符串是否为合法的JSON格式,使用起来非常简单,不需要进行解码操作,性能也比先解码再判断的方式更好。
函数语法如下:
<?php
/**
* 验证JSON字符串是否合法
* @param string $json 待验证的JSON字符串
* @return bool 合法返回true,否则返回false
*/
function checkJsonWithValidate(string $json): bool {
return json_validate($json);
}
// 测试示例
$validJson = '{"name":"test","age":20}';
$invalidJson = '{"name":"test",age:20}'; // 键没有加双引号,格式错误
var_dump(checkJsonWithValidate($validJson)); // 输出 bool(true)
var_dump(checkJsonWithValidate($invalidJson)); // 输出 bool(false)
?>
需要注意的是,json_validate函数仅验证JSON格式是否合法,不会检查JSON数据的深度或者递归限制,如果需要处理超长或者嵌套层级很深的JSON,还需要额外做限制。
方法二:使用json_decode配合json_last_error函数
如果使用的PHP版本低于8.3,没有json_validate函数,可以通过json_decode解析字符串,再结合json_last_error函数判断解析过程是否出现错误,以此验证JSON格式是否正确。
具体实现逻辑是:先调用json_decode尝试解析字符串,然后调用json_last_error获取错误码,如果错误码为JSON_ERROR_NONE,说明解析没有错误,JSON格式合法,否则格式不合法。
<?php
/**
* 低版本PHP验证JSON格式的方法
* @param string $json 待验证的JSON字符串
* @return bool 合法返回true,否则返回false
*/
function checkJsonWithDecode(string $json): bool {
// 尝试解析JSON,第二个参数true表示返回关联数组
json_decode($json, true);
// 获取最后一次JSON解析的错误码
$errorCode = json_last_error();
// 错误码为JSON_ERROR_NONE表示没有错误
return $errorCode === JSON_ERROR_NONE;
}
// 测试示例
$validJson = '[{"id":1,"title":"测试"},{"id":2,"title":"示例"}]';
$invalidJson = '[{"id":1,"title":"测试"},]'; // 尾部多了一个逗号,格式错误
var_dump(checkJsonWithDecode($validJson)); // 输出 bool(true)
var_dump(checkJsonWithDecode($invalidJson)); // 输出 bool(false)
?>
这种方式的缺点是会实际执行JSON解码操作,如果JSON字符串很长,会消耗一定的内存和性能,而且如果JSON数据本身很大,解析失败后再处理错误也会稍显繁琐。
方法三:自定义正则验证(不推荐)
有些开发者会尝试用正则表达式验证JSON格式,但是JSON的语法规则比较复杂,嵌套结构、转义字符、各种数据类型(字符串、数字、布尔值、null、数组、对象)的组合很难用正则完全覆盖,很容易出现误判的情况,因此不推荐使用这种方式。
以下是一个简单的不完整正则示例,仅能验证非常基础的JSON对象,无法覆盖所有合法场景:
<?php
/**
* 不推荐的正则验证JSON方法,仅作演示
* @param string $json 待验证的JSON字符串
* @return bool
*/
function checkJsonWithRegex(string $json): bool {
// 仅能匹配简单的键值对JSON对象,无法处理数组、嵌套、转义等场景
$pattern = '/^{"[^"]+":"[^"]+"}$/';
return preg_match($pattern, $json) === 1;
}
$testJson = '{"name":"test"}';
var_dump(checkJsonWithRegex($testJson)); // 输出 int(1) 即匹配成功
$testJson2 = '{"name":"test","age":20}'; // 多个键值对就无法匹配
var_dump(checkJsonWithRegex($testJson2)); // 输出 int(0) 即匹配失败,但实际是合法JSON
?>
可以看到正则验证的局限性非常明显,实际开发中不要使用这种方式验证JSON格式。
不同方法的适用场景对比
可以通过以下表格快速了解不同验证方法的特点,选择适合自己项目的方案:
| 验证方法 | 适用PHP版本 | 性能 | 准确性 | 推荐程度 |
|---|---|---|---|---|
| json_validate函数 | PHP 8.3及以上 | 高 | 高 | 优先推荐 |
| json_decode+json_last_error | 所有PHP版本 | 中 | 高 | 低版本PHP推荐 |
| 自定义正则验证 | 所有PHP版本 | 高 | 低 | 不推荐 |
注意事项
- 验证JSON格式前,建议先判断传入的参数是否为字符串类型,如果不是字符串,直接判定为不合法,避免函数调用报错。
- json_validate函数默认只验证JSON格式,不会限制JSON的嵌套深度,如果需要处理用户输入的JSON,建议手动限制最大嵌套深度,避免恶意构造超深JSON导致程序性能问题。
- 如果验证JSON是为了后续解析使用,PHP 8.3及以上版本可以先调用json_validate验证,通过后再调用json_decode解析,这样既能保证格式正确,又不会重复解析浪费性能。
总结
PHP中验证JSON格式最推荐的方式是使用PHP 8.3新增的json_validate函数,简单高效且准确性高;如果使用低版本PHP,可以选择json_decode配合json_last_error的方式实现验证;不要尝试用正则表达式验证JSON,很容易出现漏判或者误判的情况。开发者可以根据自己项目的PHP版本选择合适的验证方案,保障JSON数据处理的稳定性。
PHPJSONjson_validatejson_last_error格式验证修改时间:2026-06-20 14:36:18