Esistono diversi formati con cui le applicazioni client-server possono scambiarsi dati, uno dei quali è diventato ormai uno standard de facto: stiamo parlando di JSON.
In questa guida presentiamo JSON e la sua sintassi e vediamo come codificare e decodificare dati in formato JSON tramite le funzioni che PHP mette a disposizione.
Indice dei contenuti
JSON è l'acronimo di JavaScript Object Notation, uno standard usato per l'interscambio di dati tra client e server e basato sulla rappresentazione degli array associativi di Javascript.
JSON, come XML, è un formato basato su testo semplice da comprendere sia per l'uomo che per i computer, ma a differenza di XML, le strutture di dati JSON sono più leggere e dunque necessitano di meno banda per il trasferimento.
I dati JSON vengono memorizzati su un file di testo che ha l'estensione .json
e vanno inviati a chi ne fa richiesta, includendo nella risposta un'intestazione HTTP uguale a Content-Type: application/json
.
Ecco i possibili scenari in cui viene utilizzato il formato JSON:
.json
di gestire le dipendenze di un progetto PHP.La sintassi JSON è costituita da una serie di coppie chiave/valore
{ "key": "value" }
Le chiavi sono sempre di tipo stringa, mentre il valore della chiave può essere una stringa, un valore booleano, un numero, un valore nullo, un array o un oggetto.
Le stringhe devono essere racchiuse tra doppi apici e possono contenere caratteri di escape come \n
, \t
e \
.
Il contenuto tipico di un file JSON assomiglia a questo:
{
"player": "Cristiano Ronaldo",
"team": "Juventus",
"age": 34,
"statistics": [
{
"matches": 989,
"goals": 712,
"assists": 219
}
]
}
Nonostante JSON assomigli a un oggetto o un array associativo, in realtà è una stringa serializzata, il che significa che può essere decodificata in diversi tipi di dati.
Il linguaggio PHP consente di gestire questa tipologia di struttura tramite le seguenti funzioni:
json_encode()
: codifica un array associativo in JSON.json_decode()
: decodifica un file JSON in un oggetto o array associativo.json_last_error()
e json_last_error_message
: restituiscono rispettivamente in formato intero e stringa, l'ultimo errore relativo alla codifica/decodifica con le funzioni elencate sopra.Entrambe le funzioni json_encode()
e json_decode()
funzionano solo con dati di tipo stringa con codifica UTF-8.
In PHP la funzione json_encode()
viene utilizzata per codificare un valore nel formato JSON. Il valore codificato può essere di qualunque tipo di dati tranne una risorsa, ad esempio un gestore di file.
L'esempio seguente mostra come codificare un array associativo PHP in un oggetto JSON:
<?php
$player = [
"player" => "Cristiano Ronaldo",
"age" => 34,
"statistics" => [
"matches" => 989,
"goals" => 712,
"assists" => 219
]
];
$json = json_encode($player);
var_dump($json);
L'ouput del programma è il seguente
string(94) "{"player":"Cristiano Ronaldo","age":34,"statistics":{"matches":989,"goals":712,"assists":219}}"
Se vogliamo salvare il contenuto della variabile PHP $json
in un file JSON possiamo utilizzare la funzione file_put_contents()
in questo modo
file_put_contents('player.json', $json);
Decodificare dati JSON è altrettanto semplice quanto codificarli. Il linguaggio mette a disposizione la funzione json_decode()
per convertire una stringa JSON nel tipo di dati PHP appropriato.
L'esempio seguente mostra come decodificare o convertire un oggetto JSON in un oggetto PHP
<?php
$data = '{
"name": "Mario",
"surname": "Rossi",
"age": 40,
"contacts": [
{
"email": "mariorossi@gmail.com",
"phone": "3200202020"
}
]
}';
$json = json_decode($data);
var_dump($json);
Nel listato precedente abbiamo memorizzato alcuni dati in formato JSON nella variabile $data
. In alternativa, avremmo potuto salvarli in un file con estensione .json
e richiamare tale file tramite la funzione per leggere file file_get_contents()
.
L'output del programma è il seguente
object(stdClass)#1 (4) {
["name"]=>
string(5) "Mario"
["surname"]=>
string(5) "Rossi"
["age"]=>
int(40)
["contacts"]=>
array(1) {
[0]=>
object(stdClass)#2 (2) {
["email"]=>
string(20) "mariorossi@gmail.com"
["phone"]=>
string(10) "3200202020"
}
}
}
Come possiamo notare, la funzione json_encode()
restituisce un oggetto della classe stdClass
coi valori codificati a seconda del tipo di dato trovato nella stringa JSON memorizzata in $data
.
Possiamo anche accedere al valore di una singola chiave in questo modo
<?php
echo $json->name; // Mario
echo $json->age; // 40
echo $json->contacts[0]->email; // mariorossi@gmail.com
Di default, la funzione json_decode()
restituisce un oggetto stdClass
. Tuttavia, è possibile specificare opzionalmente un secondo parametro che accetta un valore booleano che, quando impostato a true
, consente la conversione dell'oggetto JSON in un array associativo.
Di seguito è mostrato un esempio di utilizzo
<?php
$data = '{
"name": "Mario",
"surname": "Rossi",
"age": 40,
"contacts": [
{
"email": "mariorossi@gmail.com",
"phone": "3200202020"
}
]
}';
$json = json_decode($data, true); // il secondo parametro settato a true specifica che vogliamo farci restituire un array associativo
var_dump($json);
Il codice visto in precedenza produrrà il seguente output
array(4) {
["name"]=>
string(5) "Mario"
["surname"]=>
string(5) "Rossi"
["age"]=>
int(40)
["contacts"]=>
array(1) {
[0]=>
array(2) {
["email"]=>
string(20) "mariorossi@gmail.com"
["phone"]=>
string(10) "3200202020"
}
}
}
È dunque possibile accedere ai dati come in un normale array associativo.
Per formattare i dati di un file JSON in formato tabellare possiamo utilizzare un ciclo foreach per iterare l'oggetto che ci viene restituito dalla funzione json_decode()
.
Poniamo di avere i dati memorizzati in un file chiamato users.json
. Il contenuto di tale file è il seguente
[{"name":"Pinco","surname":"Pallino"},{"name":"Mario","surname":"Rossi"},{"name":"Tizio","surname":"Gialli"},{"name":"Sempronio","surname":"Marroni"}]
mentre il codice PHP che mostra i dati in una tabella è il seguente
<?php
$file = file_get_contents("users.json");
$users = json_decode($file);
if (JSON_ERROR_NONE !== json_last_error()) {
printf("%s", json_last_error_msg());
exit;
}
?>
<table>
<tbody>
<?php foreach ($users as $user):?>
<tr>
<td><?php echo $user->name?></td>
<td><?php echo $user->surname?></td>
</tr>
<?php endforeach;?>
</tbody>
<table>
che, salvo errori, produce il seguente output HTML
<table>
<tbody>
<tr>
<td>Pinco</td>
<td>Pallino</td>
</tr>
<tr>
<td>Mario</td>
<td>Rossi</td>
</tr>
<tr>
<td>Tizio</td>
<td>Gialli</td>
</tr>
</tbody>
<table>
La funzione json_last_error()
dell'esempio precedente restituisce un numero intero equivalente ad una costante che può riferirsi ad uno specifico errore.
Se ad esempio la funzione restituisce il numero 4, ciò indica un errore di sintassi JSON, come mostrato dalla funzione json_last_error_msg()
, la quale mostra l'errore in formato stringa.
Per un elenco completo delle costanti di errore della funzione json_last_error()
è possibile consultare la documentazione.