JSON Stringify / Unstringify
Trasforma un oggetto JSON in una stringa letterale su una sola riga con virgolette escaped da incorporare nel codice, oppure converte una stringa JSON escaped di nuovo in JSON leggibile.
1.017 visualizzazioni
Come Funziona
Stringify prende un JSON reale e lo trasforma in un letterale stringa su una sola riga, con virgolette escaped — il formato necessario quando devi incorporare JSON dentro un altro campo JSON, un valore di configurazione o una costante stringa nel codice sorgente. Internamente è esattamente ciò che fa JSON.stringify() di JavaScript: percorre il valore, mette tra virgolette le stringhe, esegue l'escape dei caratteri di controllo e delle virgolette incorporate, e serializza oggetti e array in testo. Unstringify fa il contrario: incolla una stringa JSON con escape (con \" e \n) e ottieni JSON pulito, leggibile e indentato, equivalente a chiamarci sopra JSON.parse() e stampare il risultato in modo leggibile.
Esempio concreto: l'oggetto {"name":"Ada","tags":["a","b"]} diventa il letterale "{\"name\":\"Ada\",\"tags\":[\"a\",\"b\"]}" — ogni virgoletta doppia interna riceve una barra rovesciata davanti, così l'intera cosa può stare dentro un'unica coppia di virgolette esterne. È esattamente ciò che accade quando un'API racchiude un payload JSON come stringa dentro un'altra risposta JSON (il corpo di un webhook, una riga di log, una colonna di database di tipo testo), oppure quando un valore JSON deve essere inserito in un file YAML, in una variabile d'ambiente o in una costante stringa nel codice sorgente senza rompere la sintassi circostante. Unstringify fa il percorso inverso: incolla quel blob con escape e ottieni l'originale, indentato e leggibile.
Vale la pena conoscere alcuni comportamenti di JSON.stringify() anche se non tocchi mai direttamente questo strumento: i valori undefined e le funzioni vengono eliminati silenziosamente dalle proprietà degli oggetti (una chiave che contiene undefined scompare semplicemente), ma gli stessi valori dentro un array vengono convertiti in null invece di essere eliminati, perché gli array devono mantenere intatte la loro lunghezza e le posizioni degli indici. Gli oggetti Date non vengono serializzati come oggetti — vengono convertiti tramite il loro metodo toJSON() in una stringa ISO 8601 come "2024-01-15T10:30:00.000Z". E un valore che contiene un riferimento circolare — un oggetto che (direttamente o attraverso una catena di proprietà) fa riferimento a se stesso — non può essere trasformato in stringa: il vero JSON.stringify() genera un TypeError: Converting circular structure to JSON, perché non esiste una stringa finita capace di rappresentare una struttura infinitamente annidata.
Cosa Dovresti Sapere
Lo stringify è un'operazione con perdita in un senso specifico: tutto ciò che viene eliminato silenziosamente (funzioni, proprietà undefined, chiavi Symbol) non può essere recuperato facendo poi l'unstringify — il percorso di andata e ritorno conserva solo ciò che il JSON valido può rappresentare fin dall'inizio, cioè stringhe, numeri, booleani, null, oggetti semplici e array. Nel codice reale, JSON.stringify() accetta anche due argomenti aggiuntivi oltre al valore stesso: un replacer (una funzione o un array di nomi di chiave che controlla esattamente quali proprietà vengono incluse, o come i loro valori vengono trasformati prima della serializzazione), e un parametro space (un numero o una stringa che trasforma l'output compatto su una riga in JSON indentato e leggibile — è esattamente la differenza tra una risposta API minificata e la versione formattata che ti mostra un debugger).
Il JSON codificato due volte è una fonte comune di confusione: se un valore sembra una stringa JSON ma il suo primissimo carattere è una virgoletta ed è pieno di virgolette interne con escape a barra rovesciata, probabilmente è stato trasformato in stringa due volte — una volta dall'applicazione, un'altra da un livello che non si è accorto che il payload era già una stringa JSON. Farlo passare una volta per unstringify risolve il livello esterno; se il risultato sembra ancora con escape, eseguilo di nuovo.
Domande Frequenti
Qual è la differenza rispetto a JSON.stringify nel codice?
La stessa operazione, ma come strumento interattivo: incolla JSON reale e ottieni la forma stringa con escape che altrimenti produrresti scrivendo JSON.stringify(obj) — utile quando non hai una console a portata di mano.
Perché dovrei fare unstringify di un JSON?
API e log a volte annidano una stringa JSON dentro un campo JSON (JSON codificato due volte) — unstringify converte quella stringa interna con escape di nuovo in JSON leggibile e analizzabile.
Perché una proprietà è scomparsa dopo lo stringify?
JSON.stringify() omette silenziosamente le proprietà di un oggetto il cui valore è undefined o una funzione — non esiste una rappresentazione JSON per nessuno dei due, quindi la chiave viene eliminata del tutto invece di essere serializzata come null. Lo stesso valore undefined dentro un array diventa null invece di sparire, perché gli array devono preservare la loro lunghezza e l'ordine degli indici.
Perché ottengo un errore di "struttura circolare"?
Se un oggetto fa riferimento a se stesso, direttamente o attraverso una catena di altri oggetti, JSON.stringify() non riesce a produrne una stringa finita e genera un TypeError. È comune quando si serializzano oggetti che contengono un riferimento all'indietro verso il proprio genitore (un nodo figlio che punta di nuovo al proprio albero, un elemento del DOM, un'istanza di classe con un campo "self") — la soluzione è rimuovere o sostituire la proprietà circolare prima di serializzare, spesso con una funzione replacer.
I miei dati vengono caricati da qualche parte?
No — entrambe le direzioni funzionano localmente nel tuo browser.
Strumenti Simili
Segnala un Problema
JSON Stringify / Unstringify
Commenti
Ancora nessun commento — scrivi il primo!