php 8.3 新增的 json_validate() 函数是专门用于校验 json 字符串的工具,而 json_decode() 则是用于将 json 字符串解析为 php 变量的通用函数。如果只需要判断 json 是否合法而不需要提取数据,应优先使用 json_validate(),因为它执行速度更快且内存占用更低;如果需要获取解析后的数组或对象,则必须使用 json_decode()。

如何仅验证 JSON 格式合法性?
要仅验证 JSON 格式合法性,直接调用 json_validate(string $json) 即可。该函数在 PHP 8.3 中引入,接收一个 JSON 字符串作为参数,如果字符串符合 RFC 7159 标准则返回 true,否则返回 false。它不会进行任何内存分配来存储解析结果,因此比先调用 json_decode() 再检查其返回值的方式更高效。

$jsonString = '{"name":"John","age":30}';
if (json_validate($jsonString)) {
echo "JSON is valid.";
} else {
echo "JSON is invalid.";
}上述代码中,$jsonString 是一个合法的 JSON 对象字符串。运行后,json_validate() 返回 true,程序输出 “JSON is valid.”。如果将 $jsonString 改为 '{"name":"John", age:30}'(缺少引号),json_validate() 将返回 false,程序输出 “JSON is invalid.”。
立即学习“PHP免费学习笔记(深入)”;
何时需要使用 json_decode() 进行解析?
当需要从 JSON 字符串中提取数据时,必须使用 json_decode()。该函数不仅验证格式,还会将 JSON 转换为 PHP 变量(数组或对象)。如果 JSON 格式无效,json_decode() 会返回 null,并可通过 json_last_error_msg() 获取错误信息。与 json_validate() 不同,json_decode() 会分配内存来存储解析结果,因此在只需验证的场景下性能较差。

$jsonString = '{"name":"Jane","city":"New York"}';
$data = json_decode($jsonString, true);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
echo "Error: " . json_last_error_msg();
} else {
print_r($data);
}在上述代码中,json_decode($jsonString, true) 将 JSON 字符串解析为关联数组。由于输入是合法的,$data 包含解析后的数组,程序输出数组内容。如果输入非法,$data 为 null,json_last_error() 返回非零值,程序输出错误消息。注意,json_decode() 默认返回对象,传入 true 参数才返回数组。
json_validate 对空字符串的处理结果是什么?
json_validate() 对空字符串 '' 的处理结果是返回 false。根据 RFC 7159 标准,JSON 文本必须是有效的 JSON 值,而空字符串不是有效的 JSON 值。有效的 JSON 值包括对象、数组、字符串、数字、布尔值或 null,但空字符串本身不符合这些类型。因此,json_validate('') 会立即返回 false,无需进一步处理。
$emptyJson = '';
if (json_validate($emptyJson)) {
echo "Valid.";
} else {
echo "Invalid.";
}运行上述代码,$emptyJson 为空字符串,json_validate() 返回 false,程序输出 “Invalid.”。这验证了空字符串不被视为有效 JSON。相比之下,json_decode('') 也会返回 null,但 json_validate() 更明确地表达了“验证”意图,且性能更优。



















