PHP 8.3 新特性 - json_validate

作者: 温新

图书: 【PHP 8.3 新特性】

阅读: 615

时间: 2024-11-24 11:34:25

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 函数,无论给定的什么样的字符串,它只会返回 truefalse。也就是说,你给我的字符串要么是 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_decodejson_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_errorjson_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
请登录后再评论