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
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.
-
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()); } -
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.
-
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.
-
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.
-
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