Проверка строки на 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()
. Этот подход может быть полезен при работе с данными, поступающими из внешних источников, когда вы не уверены в их формате.