Самый быстрый способ проверить, является ли строка JSON в PHP? - PullRequest
342 голосов
/ 18 мая 2011

Мне нужен действительно очень быстрый способ проверки, является ли строка JSON или нет. Я чувствую, что это не лучший способ:

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

Любые энтузиасты производительности хотят улучшить этот метод?

Ответы [ 25 ]

521 голосов
/ 18 мая 2011
function isJson($string) {
 json_decode($string);
 return (json_last_error() == JSON_ERROR_NONE);
}
143 голосов
/ 04 марта 2013

Ответ на вопрос

Функция 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 INPUT

$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) </strong>

Поскольку json_last_error не поддерживается в PHP 5.2, вы можете проверить, возвращает ли кодировка или декодирование логическое значение FALSE.Вот пример

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

Надеюсь, это полезно.Удачного кодирования!

73 голосов
/ 07 сентября 2012

Все, что вам действительно нужно сделать, это ...

if (is_object(json_decode($MyJSONArray))) 
    { 
        ... do something ...
    }

Этот запрос даже не требует отдельной функции.Просто оберните is_object вокруг json_decode и двигайтесь дальше.Похоже, что в этом решении люди слишком много думают.

69 голосов
/ 18 мая 2011

Использование json_decode для «проверки» может быть не самым быстрым способом. Если это глубоко вложенная структура, то создание множества объектов массивов для их просто выброса - пустая трата памяти и времени.

Так что может быть быстрее использовать preg_match и RFC4627 регулярное выражение для обеспечения достоверности :

  // in JS:
  var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
         text.replace(/"(\\.|[^"\\])*"/g, '')));

То же самое в PHP:

  return !preg_match('/[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]/',
       preg_replace('/"(\\.|[^"\\\\])*"/', '', $json_string));

Однако, здесь недостаточно энтузиаста производительности, чтобы беспокоиться о тестах.

31 голосов
/ 06 апреля 2017

Это вернет true , если ваша строка представляет собой массив или объект json :

function isJson($str) {
    $json = json_decode($str);
    return $json && $str != $json;
}

Она отклоняет строки json, содержащие только число, строку илилогическое значение, хотя эти строки являются технически действительными json.

var_dump(isJson('{"a":5}')); // bool(true)
var_dump(isJson('[1,2,3]')); // bool(true)
var_dump(isJson('1')); // bool(false)
var_dump(isJson('1.5')); // bool(false)
var_dump(isJson('true')); // bool(false)
var_dump(isJson('false')); // bool(false)
var_dump(isJson('null')); // bool(false)
var_dump(isJson('hello')); // bool(false)
var_dump(isJson('')); // bool(false)

Это самый короткий способ, который я могу придумать.

19 голосов
/ 28 августа 2014

Самый простой и быстрый способ, которым я пользуюсь, следующий:

$json_array = json_decode( $raw_json , true );

if( $json_array == NULL )   //check if it was invalid json string
    die ('Invalid');  // Invalid JSON error

 // you can execute some else condition over here in case of valid JSON

Это потому, что json_decode () возвращает NULL, если введенная строка не является json или недопустима json.


Простая функция для проверки JSON

Если вам нужно проверить JSON в нескольких местах, вы всегда можете использовать следующую функцию.

function is_valid_json( $raw_json ){
    return ( json_decode( $raw_json , true ) == NULL ) ? false : true ; // Yes! thats it.
}

В приведенной выше функции вы получите true в ответ, если это правильный JSON.

17 голосов
/ 18 мая 2011
function is_json($str){ 
    return json_decode($str) != null;
}

http://tr.php.net/manual/en/function.json-decode.php Возвращаемое значение равно нулю при обнаружении неверной кодировки.

11 голосов
/ 21 октября 2013

Вы должны проверить введенные данные, чтобы убедиться, что передаваемая строка не пустая и фактически является строкой.Пустая строка недопустима JSON.

function is_json($string) {
  return !empty($string) && is_string($string) && is_array(json_decode($string, true)) && json_last_error() == 0;
}

Я думаю, в PHP важнее определить, есть ли у объекта JSON даже данные , потому что для использования данных вам нужно будет вызватьjson_encode() или json_decode().Я предлагаю запретить пустые объекты JSON, чтобы вы не выполняли ненужное кодирование и декодирование пустых данных.

function has_json_data($string) {
  $array = json_decode($string, true);
  return !empty($string) && is_string($string) && is_array($array) && !empty($array) && json_last_error() == 0;
}
8 голосов
/ 01 августа 2018

Это будет сделано:

function isJson($string) {
    $decoded = json_decode($string); // decode our JSON string
    if ( !is_object($decoded) && !is_array($decoded) ) {
        /*
        If our string doesn't produce an object or array
        it's invalid, so we should return false
        */
        return false;
    }
    /*
    If the following line resolves to true, then there was
    no error and our JSON is valid, so we return true.
    Otherwise it isn't, so we return false.
    */
    return (json_last_error() == JSON_ERROR_NONE);
}

if ( isJson($someJsonString) ) {
    echo "valid JSON";
} else {
    echo "not valid JSON";
}

Как показано в других ответах, json_last_error() возвращает любую ошибку из нашего последнего json_decode ().Однако есть некоторые крайние случаи использования, когда одна эта функция не является достаточно полной.Например, если вы json_decode() целое число (например, 123) или строка чисел без пробелов или других символов (например, "123"), функция json_last_error() не будетпоймать ошибку.

Чтобы бороться с этим, я добавил дополнительный шаг, который гарантирует, что результат json_decode() будет либо объектом, либо массивом.Если это не так, то мы возвращаем false.

Чтобы увидеть это в действии, проверьте эти два примера:

7 голосов
/ 29 сентября 2016

Простой метод - проверить результат json.

$result = @json_decode($json,true);
    if (is_array($result)) {
        echo 'JSON is valid';
    }else{
        echo 'JSON is not valid';
    }
...