在PHP中检查一个字符串是否为JSON的最快方法是什么?

24 浏览
0 Comments

在PHP中检查一个字符串是否为JSON的最快方法是什么?

我需要一种非常快速的方法来检查一个字符串是否为JSON。我感觉这不是最好的方法:

function isJson($string) {
    return ((is_string($string) &&
            (is_object(json_decode($string)) ||
            is_array(json_decode($string))))) ? true : false;
}

。有没有性能专家想要改进这种方法?

admin 更改状态以发布 2023年5月21日
0
0 Comments

问题的答案

函数json_last_error返回JSON编码和解码期间最后发生的错误。因此,检查有效的JSON的最快方法是

// decode the JSON data
// set second parameter boolean TRUE for associative array output.
$result = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
    // JSON is valid
}
// OR this is equivalent
if (json_last_error() === 0) {
    // JSON is valid
}

请注意,json_last_error仅在PHP> = 5.3.0中受支持。

检查确切错误的完整程序

在开发时间知道确切的错误总是很有用的。这是根据PHP文档检查确切错误的完整程序。

function json_validate($string)
{
    // decode the JSON data
    $result = json_decode($string);
    // switch and check possible JSON errors
    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            $error = ''; // JSON is valid // No error has occurred
            break;
        case JSON_ERROR_DEPTH:
            $error = 'The maximum stack depth has been exceeded.';
            break;
        case JSON_ERROR_STATE_MISMATCH:
            $error = 'Invalid or malformed JSON.';
            break;
        case JSON_ERROR_CTRL_CHAR:
            $error = 'Control character error, possibly incorrectly encoded.';
            break;
        case JSON_ERROR_SYNTAX:
            $error = 'Syntax error, malformed JSON.';
            break;
        // PHP >= 5.3.3
        case JSON_ERROR_UTF8:
            $error = 'Malformed UTF-8 characters, possibly incorrectly encoded.';
            break;
        // PHP >= 5.5.0
        case JSON_ERROR_RECURSION:
            $error = 'One or more recursive references in the value to be encoded.';
            break;
        // PHP >= 5.5.0
        case JSON_ERROR_INF_OR_NAN:
            $error = 'One or more NAN or INF values in the value to be encoded.';
            break;
        case JSON_ERROR_UNSUPPORTED_TYPE:
            $error = 'A value of a type that cannot be encoded was given.';
            break;
        default:
            $error = 'Unknown JSON error occured.';
            break;
    }
    if ($error !== '') {
        // throw the Exception or exit // or whatever :)
        exit($error);
    }
    // everything is OK
    return $result;
}

使用有效的JSON输入进行测试

$json = '[{"user_id":13,"username":"stack"},{"user_id":14,"username":"over"}]';
$output = json_validate($json);
print_r($output);

有效的输出

Array
(
    [0] => stdClass Object
        (
            [user_id] => 13
            [username] => stack
        )
    [1] => stdClass Object
        (
            [user_id] => 14
            [username] => over
        )
)

使用无效JSON进行测试

$json = '{background-color:yellow;color:#000;padding:10px;width:650px;}';
$output = json_validate($json);
print_r($output);

无效的输出

Syntax error, malformed JSON.

(PHP> = 5.2 && PHP <5.3.0)的额外注意事项

由于json_last_error不支持PHP 5.2,因此您可以检查编码或解码是否返回布尔值FALSE。这是一个例子

// decode the JSON data
$result = json_decode($json);
if ($result === FALSE) {
    // JSON is invalid
}

0
0 Comments
function isJson($string) {
   json_decode($string);
   return json_last_error() === JSON_ERROR_NONE;
}

的中文翻译为:粗体字的“123”。

0