Проверка строки на JSON в PHP: функция maybe_json_decode()

Проверка строки на JSON в PHP

В этом руководстве мы рассмотрим, как проверить, является ли переданная строка строкой формата JSON, и как декодировать её, если это так. Этот код выполняет аналогичную задачу функции maybe_unserialize(), но только для данных в формате JSON.

Функция для декодирования JSON

Ниже представлена функция, которая декодирует строку JSON только в том случае, если она действительно является строкой формата JSON. Если это не так, функция вернет исходные данные.

/**
 * Декодирует строку JSON, если указанная строка действительно является JSON.
 * В противном случае возвращает исходные данные.
 *
 * @param mixed $data  Строка для проверки и декодирования.
 * @param int   $flags Четвёртый параметр для json_decode(). {@see https://php.net/json_decode}
 *
 * @return mixed Данные в формате JSON, если передана строка JSON.
 *               Исходные данные, если это не строка JSON.
 */
function maybe_json_decode( $data, $flags = 0 ) {
    if( ! is_string( $data ) ) {
        return $data;
    }

    // Убираем пробелы в начале и конце строки
    $data = trim( $data );

    // Декодируем строку JSON
    $json = json_decode( $data, null, 512, $flags );

    // Проверяем на наличие ошибок
    if( json_last_error() !== JSON_ERROR_NONE ) {
        return $data;
    }

    // Если декодированные данные совпадают с оригинальными
    if( $json === $data ) {
        return $data;
    }

    return $json;
}

Как использовать функцию

Ниже приведен пример использования функции maybe_json_decode(). В качестве тестов используется массив различных значений.

$tests = [
    '{ "asd": 123 }',
    12,
    '  123',
    '[ 123 ]',
    '{foo}',
];

foreach( $tests as $data ) {
    var_dump( maybe_json_decode( $data ) );
}

Результаты выполнения

При выполнении этого кода вы получите следующий вывод:

object(stdClass)#1301 (1) {
  ["asd"]=> int(123)
}
int(12)
int(123)
array(1) {
  [0]=> int(123)
}
string(5) "{foo}"

Объяснение результатов

  • Первый пример: '{"asd": 123}' преобразуется в объект PHP.
  • Второй пример: 12 остаётся как есть — это не строка JSON.
  • Третий пример: ' 123' остаётся как есть, вновь не JSON.
  • Четвёртый пример: '[ 123 ]' становится массивом PHP.
  • Пятый пример: '{"foo"}' не является корректной строкой JSON, поэтому возвращается исходная строка.

Заключение

Теперь вы знаете, как проверить, является ли строка в формате JSON, и как декодировать её при необходимости с помощью функции maybe_json_decode(). Этот подход может быть полезен при работе с данными, поступающими из внешних источников, когда вы не уверены в их формате.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *