Federico Lelli / SchoolNode.js & Express
LEZIONE 19 · Express e API

JSON come formato di scambio

Prima di iniziare: le parole della lezione

JSON e oggetto JavaScript
JSON, JavaScript Object Notation, è un formato di testo per dati. Un oggetto JavaScript è invece un valore già presente in memoria: le due cose non sono identiche.
Serializzazione e parsing
Serializzare significa convertire un valore in testo trasmissibile. Fare parsing significa analizzare il testo e ricostruire una struttura di dati.
Schema e validazione
Uno schema descrive campi, tipi e vincoli attesi. La validazione verifica che i dati rispettino quelle regole, dopo che il testo è stato interpretato.

JSON è un formato testuale con oggetti, array, stringhe, numeri, booleani e null. In Express res.json() serializza un oggetto JavaScript e imposta la risposta JSON.

app.use(express.json()); // interpreta richieste con body JSON
app.get('/api/prodotti', (req, res) => {
  res.json([{ id: 1, nome: 'Tastiera', prezzo: 45 }]);
});
app.post('/api/eco', (req, res) => {
  res.status(201).json({ ricevuto: req.body });
});

Esempio aggiuntivo: invia {"nome":"Mouse"} con header Content-Type: application/json. Sicurezza: il fatto che req.body sia stato interpretato come JSON non significa che i dati siano validi: controlla tipi, lunghezze e valori.

Chi fa cosa, e perché

res.json(oggetto) serializza il valore e imposta il formato della risposta. express.json() compie l’operazione opposta per le richieste con Content-Type JSON: legge il body e rende il valore disponibile come req.body. Non serve per poter inviare JSON con una GET; serve per leggere JSON in ingresso.

JSON usa doppi apici per chiavi e stringhe, non accetta commenti, funzioni o undefined. Una data JavaScript viene normalmente serializzata come stringa; un array può contenere oggetti, numeri e altri valori JSON. Il middleware non decide se un prezzo è positivo o se un nome è troppo lungo: sono regole applicative da verificare dopo.

Un altro esempio guidato

// conversioni.cjs — node conversioni.cjs
const persona = { nome: 'Anna', attiva: true, ruoli: ['editor'] };
const testo = JSON.stringify(persona);
const ricostruita = JSON.parse(testo);
console.log(typeof testo);       // string
console.log(ricostruita.nome);   // Anna
console.log(persona === ricostruita); // false

Come leggerlo e risultato atteso. JSON.stringify crea testo; JSON.parse crea una nuova struttura dati. Il confronto finale è falso perché i due oggetti hanno identità diverse. Non passare a res.json una stringa già serializzata se vuoi trasmettere un oggetto: finiresti per inviare una stringa JSON.

Prova tu. Prova JSON con una virgola finale e osserva il fallimento di JSON.parse. Poi invia un JSON valido ma con nome: 123: il parser riesce, la validazione del nome deve fallire.

Torna all’indice ↑

Materiali didattici curati e rielaborati da Federico Lelli. Le fonti e i riferimenti specifici sono indicati nei materiali disponibili.