PHP Depuración de errores JSON


Ejemplo

Cuando json_encode o json_decode no puede analizar la cadena proporcionada, devolverá false . PHP en sí mismo no generará ningún error o advertencia cuando esto suceda, la responsabilidad del usuario es utilizar las funciones json_last_error () y json_last_error_msg () para verificar si ocurrió un error y actuar en consecuencia en su aplicación (depurarlo, mostrar un mensaje de error , etc.).

El siguiente ejemplo muestra un error común cuando se trabaja con JSON, un error al descodificar / codificar una cadena JSON (por ejemplo, al pasar una cadena codificada en UTF-8 incorrecta) .

// An incorrectly formed JSON string
$jsonString = json_encode("{'Bad JSON':\xB1\x31}");

if (json_last_error() != JSON_ERROR_NONE) {
    printf("JSON Error: %s", json_last_error_msg());
}

#> JSON Error: Malformed UTF-8 characters, possibly incorrectly encoded

json_last_error_msg

json_last_error_msg() devuelve un mensaje legible por humanos del último error que se produjo al intentar codificar / decodificar una cadena.

  • Esta función siempre devolverá una cadena , incluso si no se produjo ningún error.
    La cadena predeterminada que no es de error es No Error
  • Devolverá false si se produce algún otro error (desconocido)
  • Tenga cuidado al usar esto en bucles, ya que json_last_error_msg se anulará en cada iteración.

Solo debe usar esta función para mostrar el mensaje, no para probar en las declaraciones de control.

// Don't do this:
if (json_last_error_msg()){} // always true (it's a string)
if (json_last_error_msg() != "No Error"){} // Bad practice

// Do this: (test the integer against one of the pre-defined constants)
if (json_last_error() != JSON_ERROR_NONE) {
    // Use json_last_error_msg to display the message only, (not test against it)
    printf("JSON Error: %s", json_last_error_msg());
}

Esta función no existe antes de PHP 5.5. Aquí hay una implementación de polyfill:

if (!function_exists('json_last_error_msg')) {
    function json_last_error_msg() {
        static $ERRORS = array(
            JSON_ERROR_NONE => 'No error',
            JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
            JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
            JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
            JSON_ERROR_SYNTAX => 'Syntax error',
            JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
        );

        $error = json_last_error();
        return isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error';
    }
}

json_last_error

json_last_error() devuelve un entero asignado a una de las constantes predefinidas provistas por PHP.

Constante Sentido
JSON_ERROR_NONE No ha ocurrido ningún error
JSON_ERROR_DEPTH Se ha superado la profundidad máxima de pila.
JSON_ERROR_STATE_MISMATCH JSON inválido o mal formado
JSON_ERROR_CTRL_CHAR Error de carácter de control, posiblemente codificado incorrectamente
JSON_ERROR_SYNTAX Error de sintaxis (desde PHP 5.3.3)
JSON_ERROR_UTF8 Caracteres UTF-8 con formato incorrecto, posiblemente codificados incorrectamente (desde PHP 5.5.0)
JSON_ERROR_RECURSION Una o más referencias recursivas en el valor a codificar
JSON_ERROR_INF_OR_NAN Uno o más valores NAN o INF en el valor a codificar
JSON_ERROR_UNSUPPORTED_TYPE Se dio un valor de un tipo que no puede ser codificado