Saltar al contenido
jsonbeautifiers
Español
PHP Nombres de constantes y mensajes tomados del manual de PHP.

json_decode() returns NULL

PHP no lanza excepciones ante JSON inválido por defecto. json_decode simplemente devuelve NULL, que además es un resultado legítimo para la entrada "null", así que no puedes distinguir el fallo del éxito solo por el valor devuelto. Lo primero es conseguir que PHP te diga qué ha fallado.

Pega tu JSON y ve exactamente dónde se rompe

Entrada

Nada de lo que pegues sale de tu navegador. La lista de permitidos de connect-src convierte eso en una garantía del navegador, no en una promesa. Compruébalo tú mismo

Qué lo provoca realmente

Ordenados por la frecuencia con la que cada uno acaba siendo la respuesta.

  1. 01 Todavía no tienes ningún mensaje de error

    Llama a json_last_error_msg() justo después de decodificar, o pasa la bandera JSON_THROW_ON_ERROR para que se lance una JsonException en su lugar. Sin una de las dos estás depurando a ciegas, y por eso este problema le lleva tanto tiempo a la gente.

    Falla

    $data = json_decode($body, true);
    if ($data === null) { /* why? */ }

    Funciona

    $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
    // or
    $data = json_decode($body, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new RuntimeException(json_last_error_msg());
    }
  2. 02 Una marca de orden de bytes UTF-8 al principio del archivo

    Un clásico en PHP, porque file_get_contents devuelve el BOM y json_decode lo rechaza. Elimina los tres primeros bytes si son EF BB BF.

  3. 03 UTF-8 mal formado, que da JSON_ERROR_UTF8

    «Malformed UTF-8 characters, possibly incorrectly encoded» suele significar que los datos salieron de una columna de base de datos en Latin-1. Convierte con mb_convert_encoding antes de decodificar.

  4. 04 Un warning o notice impreso antes del JSON

    Cualquier salida anterior al cuerpo de tu respuesta acaba dentro de él. Desactiva display_errors en producción y registra en el log en su lugar.

  5. 05 Anidamiento más profundo que el límite por defecto, que da JSON_ERROR_DEPTH

    json_decode usa por defecto una profundidad de 512. Sube el tercer argumento si los datos son de verdad así de profundos.

Preguntas frecuentes

¿Cuáles son las constantes JSON_ERROR?
JSON_ERROR_NONE (0), JSON_ERROR_DEPTH (1, se superó la profundidad máxima de la pila), JSON_ERROR_STATE_MISMATCH (2), JSON_ERROR_CTRL_CHAR (3, se encontró un carácter de control inesperado), JSON_ERROR_SYNTAX (4, error de sintaxis, JSON mal formado), JSON_ERROR_UTF8 (5, caracteres UTF-8 mal formados), además de JSON_ERROR_RECURSION, JSON_ERROR_INF_OR_NAN, JSON_ERROR_UNSUPPORTED_TYPE, JSON_ERROR_INVALID_PROPERTY_NAME, JSON_ERROR_UTF16 y JSON_ERROR_NON_BACKED_ENUM.
¿Cómo distingo un resultado NULL de un fallo NULL?
json_last_error() === JSON_ERROR_NONE significa que la decodificación tuvo éxito, así que un NULL devuelto es el valor null genuino. Cualquier otro código significa que falló.

Arréglalo ahora

Pega el payload en la herramienta de arriba, o ve directamente a la creada para este trabajo.

Encontrar el error de sintaxis