Vai al contenuto
jsonbeautifiers
Italiano
PHP Nomi delle costanti e messaggi dal manuale di PHP.

json_decode() returns NULL

PHP per impostazione predefinita non solleva eccezioni su JSON non valido. json_decode restituisce semplicemente NULL, che è anche un risultato legittimo per l’input "null": dal solo valore di ritorno non puoi quindi distinguere il fallimento dal successo. Il primo compito è far dire a PHP che cosa è andato storto.

Incolla il tuo JSON e vedi esattamente dove si rompe

Input

Nulla di ciò che incolli lascia il tuo browser. L’allowlist connect-src ne fa una garanzia del browser anziché una promessa. Verificalo tu stesso

Che cosa lo provoca davvero

In ordine di quanto spesso ciascuno si rivela essere la risposta.

  1. 01 Non hai ancora alcun messaggio di errore

    Chiama json_last_error_msg() subito dopo la decodifica, oppure passa il flag JSON_THROW_ON_ERROR perché venga sollevata una JsonException. Senza una delle due stai facendo debug alla cieca, ed è per questo che questo problema porta via così tanto tempo.

    Si rompe

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

    Funziona

    $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 Un byte order mark UTF-8 all’inizio del file

    Un classico in PHP, perché file_get_contents restituisce il BOM e json_decode lo rifiuta. Togli i primi tre byte se sono EF BB BF.

  3. 03 UTF-8 malformato, che dà JSON_ERROR_UTF8

    «Malformed UTF-8 characters, possibly incorrectly encoded» di solito significa che i dati vengono da una colonna di database in Latin-1. Converti con mb_convert_encoding prima di decodificare.

  4. 04 Un warning o una notice stampati prima del JSON

    Qualsiasi output precedente al corpo della risposta finisce dentro di essa. Disattiva display_errors in produzione e scrivi nei log.

  5. 05 Annidamento più profondo del limite predefinito, che dà JSON_ERROR_DEPTH

    json_decode usa una profondità predefinita di 512. Alza il terzo argomento se i dati sono davvero così profondi.

Domande frequenti

Quali sono le costanti JSON_ERROR?
JSON_ERROR_NONE (0), JSON_ERROR_DEPTH (1, superata la profondità massima dello stack), JSON_ERROR_STATE_MISMATCH (2), JSON_ERROR_CTRL_CHAR (3, trovato un carattere di controllo inatteso), JSON_ERROR_SYNTAX (4, errore di sintassi, JSON malformato), JSON_ERROR_UTF8 (5, caratteri UTF-8 malformati), più JSON_ERROR_RECURSION, JSON_ERROR_INF_OR_NAN, JSON_ERROR_UNSUPPORTED_TYPE, JSON_ERROR_INVALID_PROPERTY_NAME, JSON_ERROR_UTF16 e JSON_ERROR_NON_BACKED_ENUM.
Come distinguo un risultato NULL da un fallimento NULL?
json_last_error() === JSON_ERROR_NONE significa che la decodifica è riuscita, quindi un NULL restituito è il vero valore null. Qualsiasi altro codice significa che è fallita.

Risolvilo adesso

Incolla il payload nello strumento qui sopra, oppure vai direttamente a quello creato per questo compito.

Trova l’errore di sintassi