Fare escape del JSON come letterale stringa (e decodificare JSON doppiamente codificato)

Lo stringify di JSON lo racchiude tra virgolette e fa l’escape delle virgolette interne e dei caratteri speciali, producendo un letterale stringa JSON adatto a essere incorporato altrove.

Cosa significa «stringify a un literal»

Passare una stringa JSON a JSON.stringify la racchiude tra virgolette doppie e fa l’escape di virgolette e backslash interni, producendo un singolo valore stringa adatto a essere incorporato.

Perché serve

Incorporare JSON dentro un altro campo JSON, salvare JSON in una colonna di tipo stringa, oppure passare JSON tramite variabile d’ambiente o parametro URL richiede un letterale stringa con escape.

Regole di escape

Le virgolette doppie si escapano con un backslash, i backslash si raddoppiano, e caratteri di controllo come a capo e tab diventano sequenze di escape a due caratteri. Il risultato non contiene alcun a capo non escapato.

Decodificare JSON con codifica doppia

Se ricevi una stringa che inizia con una virgoletta escapata e contiene sequenze di virgolette escapate, è stata stringify-ata. Falle un parse per ottenere la stringa JSON interna, e un secondo parse per ottenere il valore vero.

Dove compare la codifica doppia

Framework di logging che serializzano oggetti di contesto, payload di webhook che incapsulano un corpo JSON dentro un campo 'body', code di messaggi che inviano «buste JSON-as-string» e colonne di database di tipo text o varchar sono le sorgenti più comuni. Cerca una virgoletta iniziale seguita da un numero pari di backslash.

Lavorare con JSON incorporato nei log

I logger strutturati spesso stringify-ano gli oggetti per tenere ogni riga su un singolo valore. Per ispezionare, prendi la riga dal log viewer, togli l’escape con JSON.parse e poi formatta il JSON ottenuto. Evita di grep-pare un oggetto JSON multilinea — un JSON stringify-ato su una sola riga è molto più facile da cercare.

Strumenti per il round-trip

Console del browser: JSON.parse(line) restituisce il JSON interno, poi JSON.stringify(...,null,2) lo abbellisce. CLI Node: 'node -e "console.log(JSON.parse(process.argv[1]))" "<line>"' fa entrambi i passi. Lo strumento JSON Stringify di questo sito gestisce annidamenti di profondità arbitraria con un click.