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.