Con las funciones json_last_error() y json_last_error_msg() obtenemos el error, si se produce, que ha ocurrido en la última codificación o decodificación JSON mediante las funciones json_encode() o json_decode().
La primera de las funciones, json_last_error() devuelve un valor entero con el ID del último error que se haya producido. Esta función está disponible a partir de PHP 5.3.0.
En cambio, json_last_error_msg() está disponible únicamente a partir de PHP 5.5.0 y devuelve un string con el error de la última llamada a json_encode() o a json_decode().
Ejemplo
Con este ejemplo lo que haremos será provocar el mismo error que en el anterior post y obtener el resultado. El ejemplo lo vamos a ejecutar en un PHP 5.3.29, con lo que la función json_last_error_msg() no estará disponible, con lo que nos devolverá el resultado la función que creemos nosotros:
$json = '{"users":[{ "user": "Carlos", "age": 30, "country": "Spain" }, { "user": "John", "age": 25, "country": "United States" }]}' ; // Si existe la función json_last_error_msg devuelve su valor. En caso contrario si existe json_last_error devuelve el texto que tenemos asociado. Si usamos una versión anterior a PHP 5.3 nos devuelve el mensaje de que no se puede mostrar el error function getJSONError(){ return (function_exists( 'json_last_error_msg' )) ? json_last_error_msg() : ((function_exists( 'json_last_error' )) ? getJSONErrorMsg(json_last_error()) : 'This PHP cannot show the error' ); } // A partir del código de error nos muestra un mensaje function getJSONErrorMsg( $code ){ switch ( $code ) { case JSON_ERROR_NONE: $msg = 'No errors' ; break ; case JSON_ERROR_DEPTH: $msg = 'Maximum stack depth exceeded' ; break ; case JSON_ERROR_STATE_MISMATCH: $msg = 'Underflow or modes mismatch' ; break ; case JSON_ERROR_CTRL_CHAR: $msg = 'Unexpected control character found' ; break ; case JSON_ERROR_SYNTAX: $msg = 'Syntax error, malformed JSON' ; break ; case JSON_ERROR_UTF8: $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded' ; break ; default : $msg = 'Unknown error' ; break ; } return $code . ' ' . $msg ; } // Limitamos la profundidad de la recursividad a 2 $obj = json_decode( $json , true, 2); var_dump( $obj ); /* devuelve NULL -> la profundidad es 4 */ if ( $obj ==null){ $error = getJSONError(); echo $error ; /* devuelve 1 Maximum stack depth exceeded */ } |
No hay comentarios:
Publicar un comentario