PHP ci mette a disposizione nativamente due funzioni per gestire i JSON (JavaScript Object Notation):
json_encode()
json_decode()
Con queste due funzioni riusciamo a gestire completamente, o quasi, le operazioni di codifica e decodifica di un JSON. Le due funzioni, infatti, funzionano perfettamente e sono semplicissime da usare finché non abbiamo a che fare con la gestione degli errori.
La funzione json_decode()
, ad esempio, restituisce null
in caso di errore ma questo è un comportamento fuorviante poiché null
è anche un tipo di dato valido in JSON.
Come fare quindi a capire se qualcosa è andato storto oppure se, effettivamente, l'operazione è andata a buon fine? Fino alla versione 7.2 l'unico modo a disposizione era utilizzare le funzioni json_last_error()
e json_last_error_msg()
. Rispettivamente restituiscono una costante ed una stringa che indicano se si è verificato un errore.
Entrambe le funzioni, però, non bloccano l'esecuzione dello script in caso di errore e, di conseguenza, tutta la logica relativa è delegata al programmatore.
Un esempio di gestione degli errori JSON compatibile con la versione 7.2 è il seguente:
// Una stringa JSON non valida che dovrebbe restituire un errore
// Abbiamo usato gli apici anziché le virgolette, in JSON è un errore di sintassi
$json = "{'Organization': 'PHP Documentation Team'}";
$array = json_decode($json);
if (json_last_error()) {
throw new \RuntimeException(json_last_error_msg());
}
Risulta un po' verbosa e, soprattutto, aggiunge complessità dal punto di vista della gestione dell'eccezione. O aggiungiamo una nostra eccezione (es. \My\App\Exception\JsonException
oppure dobbiamo catchare un'eccezione base per gestire quel tipo di errore.
PHP 7.3 e JSON_THROW_ON_ERROR
La RFC JSON_THROW_ON_ERROR accettata con 23 voti a favore prevede l'introduzione del un nuovo flag JSON_THROW_ON_ERROR
che, come ci suggerisce il nome, solleva automaticamente un'eccezione in caso di errore.
// Una stringa JSON non valida che dovrebbe restituire un errore
// Abbiamo usato gli apici anziché le virgolette, in JSON è un errore di sintassi
$json = "{'Organization': 'PHP Documentation Team'}";
try {
$array = json_decode($json, false, 512, JSON_THROW_ON_ERROR);
} catch(\JsonException $exception) {
echo $exception->getMessage(); //restituirà "Syntax error"
}