PHP 8.3 新特性 - json_validate
hi,我是温新,一名 PHPer
快速使用 json_validate 函数
json_validate
用于检查给定的字符串中是否包含有效的 JSON 格式。
<?php
$jsonString = '{"name": "王美丽", "age": 19}';
if (json_validate($jsonString)) {
echo '有效的 JSON 字符串';
} else {
echo '无效的 JSON 字符串';
}
$str1 = '["王美丽", "王小丽"]';
$str2 = '{ "丽丽, "美美"]';
$str3 = 'hello, world';
var_dump(json_validate($str1)); // true
var_dump(json_validate($str2)); // false
var_dump(json_validate($str3)); // false
json_validate
函数,无论给定的什么样的字符串,它只会返回 true
或 false
。也就是说,你给我的字符串要么是 JSON
字符串,要么不是 JSON
字符串。
为什么新增 json_validate 函数
在 PHP 8.3 之前,需要对给定的字符串进行解码,然后判断它是否有有效的 JSON 字符串,并查看是否有错误发生。
PHP 8.3 新增的 json_validate
函数使用与 PHP 相同的底层 JSON 解析器,不同的是,json_validate
只是分析字符串而不解码,因此,它消耗的内存和处理量更少。
PHP 8.3 之前,要判断 JSON 字符串,需要这样做:
<?php
// 无效的 JSON 字符串
$json = '[{"name": "John", "age": 30}';
// 尝试解析 JSON
$parse = json_decode($json);
if ($parse === null) {
// 如果解析失败,获取最后的错误码和错误消息
$errorCode = json_last_error();
$errorMessage = json_last_error_msg();
echo "错误码: ". $errorCode . "\n";
echo "错误消息: ". $errorMessage . "\n";
} else {
echo "JSON 成功解析!\n";
}
我们需要使用 json_validate
吗?对于一些应用来说,可能已经采取了对应的措施来防止无效的 JSON 字符串,因此,可能不会觉得 json_validate
函数有用。使用 json_valiate
之后紧接着使用 json_decod
,会导致执行时间稍微增加,因为 JSON 字符串被分析了两次。
当需要确保输入的数据是有效的 JSON 格式时,那么,json_validate
的作用就来了。
json_validate 函数介绍
函数签名如下:
json_validate(string $json, int $depth = 512, int $flags = 0): bool
参数解释:
-
$json
:要验证的 JSON 字符串; -
$depth
: 设置最大深度。必须大于零; -
$flags
: 标志位的位掩码。
json_validate 标志位的位掩码
json_validate
函数接受一个位掩码标志作为其第三个参数,$flags
只接收 JSON_INVALID_UTF8_IGNORE
标志。
JSON_INVALID_UTF8_IGNORE
是自 PHP 7.2 以来存在的 PHP 常量,json_decode
函数也接受它作为参数。当传递此参数时,json_decode
和 json_validate
函数会忽略给定字符串中的 UTF-8 字符。
<?php
$jsonString = '["丽丽", "美美"]';
var_dump(json_validate($jsonString, flags: JSON_INVALID_UTF8_IGNORE)); // true
如果传递一个不被接受的值会导致 ValueError异常
:
<?php
var_dump(json_validate('', flags: JSON_BIGINT_AS_STRING));
异常如下:
PHP Fatal error: Uncaught ValueError: json_validate(): Argument #3 ($flags) must be a valid flag (allowed flags: JSON_INVALID_UTF8_IGNORE) in
json_validate 验证错误
json_validate
函数不会返回验证错误代码(如语法错误、深度耗尽、不支持的类型等)。但是,可以使用现有的json_last_error
和 json_last_error_msg
函数来确定验证错误。
<?php
// 调用 json_validate 函数并传入一个空字符串作为参数
json_validate("");
// 调用 json_last_error 函数获取最后一次的错误码
$errorCode = json_last_error();
// 调用 json_last_error_msg 函数获取最后一次的错误信息
$errorMessage = json_last_error_msg();
// 输出错误码和错误信息
echo "错误码: ". $errorCode . "\n";
echo "错误消息: ". $errorMessage . "\n";
输出结果如下:
错误码: 4
错误消息: Syntax error