Проверяем является ли строка JSON строкой

Код ниже проверяет переданную строку, является ли она JSON строкой. Декодирует её если передана JSON строка.

Аналог maybe_unserialize(), только для JSON данных.

/**
 * Decodes JSON string only if specified string is really JSON,
 * otherwise return original passed data.
 *
 * Based on {@see https://stackoverflow.com/questions/6041741/fastest-way-to-check-if-a-string-is-json-in-php}
 *
 * @param mixed $data  String to check and decode.
 * @param int   $flags json_decode() fourth parameter. {@see https://php.net/json_decode}
 *
 * @return mixed JSON data if a JSON string is passed. Original passed data if it is not a JSON string.
 */
function maybe_json_decode( $data, $flags = 0 ){

	if( ! is_string( $data ) ){
		return $data;
	}

	$data = trim( $data );

	$json = json_decode( $data, null, 512, $flags );

	if( json_last_error() !== JSON_ERROR_NONE ){
		return $data;
	}

	if( $json === $data ){
		return $data;
	}

	return $json;
}

Usage example:

$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}"
*/