Vai al contenuto
jsonbeautifiers
Italiano

Escape JSON

Trasforma qualsiasi testo in una stringa sicura da incorporare dentro JSON.

Testo
Con escape

Nulla di ciò che incolli lascia il tuo browser. L’allowlist connect-src ne fa una garanzia del browser anziché una promessa. Verificalo tu stesso

Trasforma un testo qualsiasi in qualcosa che si possa mettere in sicurezza dentro una stringa JSON. Virgolette, backslash, a capo, tabulazioni e caratteri di controllo ricevono l’escape; tutto il resto resta com’è.

È l’operazione che serve quando incorpori a mano un payload, una riga di log, una query SQL o un frammento di HTML dentro un campo JSON.

Che cosa va escapato e che cosa no

JSON definisce esattamente nove sequenze di escape e ne richiede l’uso in esattamente tre situazioni.

La virgoletta doppia
Diventa \". Altrimenti chiuderebbe la stringa.
Il backslash
Diventa \\. Altrimenti aprirebbe un escape.
I caratteri di controllo, da U+0000 a U+001F
Un a capo diventa \n, una tabulazione \t, un ritorno a capo \r, un backspace \b, un salto pagina \f. Tutto il resto in quell’intervallo prende la forma \uXXXX.
La barra
Può essere escapata come \/ ma non è obbligatorio. Le due forme indicano lo stesso carattere. L’escape esiste perché il JSON possa stare dentro un elemento script HTML, dove la sequenza </ lo chiuderebbe.
I caratteri non ASCII
Non richiedono alcun escape. JSON è UTF-8 e é, 你 e 🎉 sono tutti leciti alla lettera. Qui escaparli è un’opzione, per i sistemi che rovinano il non ASCII lungo il percorso.
L’apice singolo
Non richiede nulla. Dentro una stringa tra virgolette doppie è un carattere qualunque, e \' non è un escape JSON valido.

Surrogati ed emoji

Un carattere fuori dal Basic Multilingual Plane, categoria che comprende ogni emoji, è memorizzato come due unità di codice UTF-16. Escaparlo produce due sequenze \u, come \ud83c\udf89 per una lingua di Menelicche. È corretto e ogni parser ricostruisce il carattere.

Un surrogato spaiato, metà di una coppia del genere senza il suo partner, qui viene sempre escapato anche quando nient’altro lo è, perché emetterlo alla lettera produce testo che non è Unicode ben formato e che si corrompe alla ricodifica in UTF-8.

La risposta migliore, quasi sempre

Se stai escapando a mano per costruire del JSON, fermati e serializza invece. JSON.stringify, json.dumps e i loro equivalenti escapano correttamente ogni valore per costruzione, e non possono dimenticarne uno.

Il JSON costruito a mano è la causa profonda di quasi tutti gli errori di carattere di controllo non valido e di stringa non terminata che esistono.

How to do this in code

Fare l’escape nel codice.

js JavaScript
// Escaped and quoted
const quoted = JSON.stringify(text);

// Escaped without the surrounding quotes
const escaped = JSON.stringify(text).slice(1, -1);
py Python
import json

quoted = json.dumps(text)                      # with quotes, non-ASCII escaped
quoted = json.dumps(text, ensure_ascii=False)  # with quotes, é stays é
escaped = json.dumps(text)[1:-1]
sh Shell
# jq's @json filter escapes and quotes
printf '%s' "$text" | jq -Rs @json

# -R reads raw input, -s slurps it into one string
go Go
b, _ := json.Marshal(text)   // includes the quotes

// Marshal escapes <, > and & by default for HTML safety.
// To turn that off you need an Encoder:
var buf bytes.Buffer
enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false)
enc.Encode(text)

Domande frequenti

Devo escapare gli apici singoli?
No. Dentro una stringa JSON tra virgolette doppie un apostrofo è un carattere qualunque, e \' non è affatto un escape JSON valido. Lo è in JavaScript e in JSON5, da cui viene l’abitudine.
Conviene escapare i caratteri non ASCII?
Di solito no. JSON è UTF-8 e caratteri accentati, CJK ed emoji sono tutti leciti alla lettera. Escapali solo quando qualcosa nella catena rovina il non ASCII, il che è un buon motivo per sistemare la catena.
E un percorso di Windows?
Ogni backslash raddoppia: C:\\Users\\priya. Un percorso che finisce con un solo backslash è peggio che sbagliato, perché escapa la virgoletta di chiusura e si mangia il resto del documento.