File JSON: cosa sono e come gestirli in PHP

File JSON: cosa sono e come gestirli in PHP

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.

Cos'è JSON

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.

Utilizzi

Ecco i possibili scenari in cui viene utilizzato il formato JSON:

  • web API: per integrare un servizio web nelle proprie applicazioni, gli sviluppatori fanno uso delle API, ossia un'interfaccia per accedere in maniera lecita ai dati di quel servizio. Ad esempio api-football.com mette a disposizione le API per l'accesso a numerose statistiche sul calcio.
  • dati strutturati: usati per migliorare l'esperienza d'uso nelle pagine dei risultati di ricerca, aiutano gli spider dei motori a comprendere meglio i contenuti di una pagina web. Il formato più utilizzato per implementarli è lo standard JSON-LD, basato appunto su JSON.
  • file di configurazione: per funzionare correttamente, alcuni tool di sviluppo leggono le impostazioni da un file in formato JSON. È il caso del gestore di pacchetti Composer, che consente tramite un file .json di gestire le dipendenze di un progetto PHP.

Sintassi

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.

Codificare dati JSON

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 in oggetto PHP

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

Decodificare dati JSON in array PHP

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.

Stampare dati JSON in tabella HTML

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>

Restituire errori JSON

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.