PHP Debug degli errori JSON


Esempio

Quando json_encode o json_decode non riesce ad analizzare la stringa fornita, restituirà false . PHP non genererà alcun errore o avvertimento quando ciò accadrà, l'utente dovrà utilizzare le funzioni json_last_error () e json_last_error_msg () per verificare se si è verificato un errore e agire di conseguenza nella propria applicazione (eseguirne il debug, mostrare un messaggio di errore , eccetera.).

L'esempio seguente mostra un errore comune quando si lavora con JSON, un errore di decodifica / codifica di una stringa JSON (a causa del passaggio di una stringa errata con codifica UTF-8, ad esempio) .

// 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() restituisce un messaggio leggibile dall'ultimo errore che si è verificato durante il tentativo di codificare / decodificare una stringa.

  • Questa funzione restituirà sempre una stringa , anche se non si è verificato alcun errore.
    La stringa predefinita non di errore è No Error
  • Restituirà false se si è verificato un altro errore (sconosciuto)
  • Attento quando si usa questo nei loop, poiché json_last_error_msg verrà sovrascritto su ogni iterazione.

Dovresti usare questa funzione solo per visualizzare il messaggio, non per testarlo nelle istruzioni di controllo.

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

Questa funzione non esiste prima di PHP 5.5. Ecco una implementazione di 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() restituisce un intero mappato a una delle costanti predefinite fornite da PHP.

Costante Senso
JSON_ERROR_NONE Nessun errore si è verificato
JSON_ERROR_DEPTH La profondità massima dello stack è stata superata
JSON_ERROR_STATE_MISMATCH JSON non valido o non valido
JSON_ERROR_CTRL_CHAR Controlla l'errore del carattere, eventualmente codificato in modo errato
JSON_ERROR_SYNTAX Errore di sintassi (da PHP 5.3.3)
JSON_ERROR_UTF8 Caratteri UTF-8 non validi , eventualmente codificati in modo errato (dal PHP 5.5.0)
JSON_ERROR_RECURSION Uno o più riferimenti ricorsivi nel valore da codificare
JSON_ERROR_INF_OR_NAN Uno o più valori NAN o INF nel valore da codificare
JSON_ERROR_UNSUPPORTED_TYPE È stato fornito un valore di un tipo che non può essere codificato