Serializzare e deserializzare oggetti in Javascript

Concetti Chiave
  • La serializzazione e deserializzazione degli oggetti in Javascript avviene principalmente tramite il formato JSON.
  • Il metodo JSON.stringify() converte un oggetto in una stringa JSON.
  • Il metodo JSON.parse() converte una stringa JSON in un oggetto Javascript.
  • Il formato JSON ha alcune restrizioni rispetto alla sintassi degli oggetti Javascript, come l'obbligo di usare virgolette doppie per le chiavi.

Serializzazione

La serializzazione è quel processo che permette di convertire un oggetto, che è un'entità strutturata, in una sequenza lineare di byte o in una stringa, in modo da poterlo facilmente memorizzare o trasmettere. La deserializzazione è il processo inverso, che ricostruisce l'oggetto originale a partire dalla sua rappresentazione serializzata.

In tal senso, il linguaggio JavaScript mette a disposizione un formato di serializzazione e deserializzazione che, ormai, è diventato uno standard de facto: il formato JSON (JavaScript Object Notation).

Questo formato è molto popolare per la sua semplicità e leggibilità, ed è supportato da molti linguaggi di programmazione oltre a JavaScript. Infatti, si tratta di un formato di testo, quindi leggibile anche da un essere umano, che rappresenta gli oggetti in modo strutturato. Esso viene adoperato in vari ambiti: come file di configurazione, per lo scambio di dati tra client e server, e per la memorizzazione di dati in database NoSQL.

La sintassi di JSON è molto simile a quella degli oggetti JavaScript, ma con alcune differenze importanti. In particolare, si tratta di un sotto-insieme della sintassi degli oggetti JavaScript, pertanto un oggetto JSON è sempre un oggetto JavaScript valido, ma non tutti gli oggetti JavaScript sono validi JSON.

Le restrizioni principali del formato JSON sono:

  • Le chiavi degli oggetti devono essere sempre stringhe racchiuse tra virgolette doppie.
  • I valori possono essere stringhe (racchiuse tra virgolette doppie), numeri, booleani (true o false), null, array (racchiusi tra parentesi quadre) o oggetti (racchiusi tra parentesi graffe).
  • Gli oggetti e gli array non possono contenere funzioni o simboli.
  • Non è possibile utilizzare commenti all'interno del JSON.

Vediamo qualche esempio di notazione JSON:

{
    "nome": "Mario",
    "età": 30,
    "professioni": ["Sviluppatore", "Designer"],
    "attivo": true,
    "indirizzo": {
        "città": "Roma",
        "cap": "00100"
    }
}

Come si può notare, le chiavi sono sempre stringhe racchiuse tra virgolette doppie, e i valori possono essere di vari tipi, inclusi altri oggetti o array.

Per leggere e scrivere JSON in JavaScript, si utilizzano i metodi JSON.stringify() e JSON.parse(). Il primo metodo converte un oggetto JavaScript in una stringa JSON, mentre il secondo metodo converte una stringa JSON in un oggetto JavaScript.

Ad esempio, per serializzare un oggetto in JSON, si può fare così:

let persona = {
    nome: "Mario",
    età: 30,
    professioni: ["Sviluppatore", "Designer"],
    attivo: true,
    indirizzo: {
        città: "Roma",
        cap: "00100"
    }
};
let jsonString = JSON.stringify(persona);
console.log(jsonString);

L'output sarà:

{
    "nome":"Mario",
    "età":30,
    "professioni":["Sviluppatore","Designer"],
    "attivo":true,
    "indirizzo":{
        "città":"Roma",
        "cap":"00100"
    }
}

Questo output è una stringa JSON che rappresenta l'oggetto persona. Tale stringa può essere facilmente memorizzata su disco o inviata attraverso una rete.

Per deserializzare una stringa JSON in un oggetto JavaScript, si utilizza il metodo JSON.parse():

let jsonString = `
{
    "nome":"Mario",
    "età":30,
    "professioni":["Sviluppatore","Designer"],
    "attivo":true,
    "indirizzo":{
        "città":"Roma",
        "cap":"00100"
    }
}`;

let persona = JSON.parse(jsonString);
console.log(persona);

L'output sarà un oggetto JavaScript equivalente a quello iniziale.

In fase di serializzazione bisogna, però, prestare attenzione. Infatti, la funzione stringify ha le seguenti limitazioni:

  1. Serializza solo le proprietà enumerabili degli oggetti. Le proprietà non enumerabili non saranno incluse nella stringa JSON risultante.
  2. Non tutte le proprietà degli oggetti possono essere serializzate. Ad esempio, le funzioni, i simboli e le proprietà con valori undefined non possono essere serializzate. In questi casi, stringify semplicemente ignorerà queste proprietà.

Riprenderemo lo studio del formato JSON e della serializzazione/deserializzazione in delle lezioni successive. Vedremo, infatti, che è possibile personalizzare il processo di serializzazione e deserializzazione, ad esempio, per gestire casi particolari come la serializzazione di date o la gestione di proprietà non enumerabili.