Strumenti per sviluppatori · JSON formattatore e validatore
JSON spiegazione degli escape delle stringhe: \n, \uXXXX e caratteri di controllo
· Come funziona
json flusso di lavoro dello sviluppatore convalida
Un ritorno a capo non elaborato all'interno di una stringa JSON non è valido, così come una tabulazione. Questo post tratta le otto sequenze di escape, come funzionano gli escape \u e le coppie surrogate e perché un paragrafo incollato può invalidare un intero file.
Il paragrafo che ha rotto il carico utile
Il paragrafo che ha interrotto il carico utile: incollare un'interruzione di riga visibile in una descrizione tra virgolette inserisce un carattere di controllo direttamente nella stringa JSON. La prima riga sembra completa, ma la virgoletta di apertura prevede comunque il contenuto di una stringa o una virgoletta di chiusura. Quando il parser raggiunge l'avanzamento riga non elaborato, si ferma lì perché le stringhe JSON non possono estendersi su righe fisiche in questo modo. Il testo deve contenere l'escape di due caratteri `\n` ovunque il valore decodificato richieda una nuova riga.
Le schede copiate da un documento o foglio di calcolo causano la stessa classe di errori, anche se un editor può renderle come spaziature innocue. Sostituisci una scheda letterale con `\t`, un ritorno a capo con `\r` e altri controlli vietati con i relativi escape denominati o Unicode.
Le otto fughe che JSON consentono
Gli otto escape consentiti da JSON sono consentiti: dopo una barra rovesciata, le forme brevi sono `"`, `\\`, `\/`, `\b`, `\f`, `\n`, `\r` e `\t`. Rappresentano una virgoletta, una barra rovesciata, una barra, un backspace, un avanzamento modulo, un avanzamento riga, un ritorno a capo e una tabulazione orizzontale. Una barra può anche apparire senza caratteri di escape; `\/` esiste principalmente per compatibilità con contesti che una volta trattavano in modo speciale una sequenza di script di chiusura.
Nessun'altra lettera può seguire una barra rovesciata JSON. Le sequenze familiari dai linguaggi di programmazione, come `\v`, `\0`, `\x41` o una barra rovesciata seguita da un carattere fisico a capo, non sono valide in questo caso. Utilizzare `\u` seguito esattamente da quattro cifre esadecimali quando non esiste un escape breve. Questo piccolo vocabolario fisso mantiene portatili le stringhe JSON: un consumatore non ha bisogno di JavaScript, di Python o di regole di escape specifiche della shell per determinare i caratteri rappresentati da un testo valido.
Perché una scheda letterale non è valida ma una é letterale va bene
Perché una scheda letterale non è valida ma una é letterale va bene: JSON vieta i punti di codice senza caratteri di escape da U+0000 a U+001F all'interno delle stringhe. Tale intervallo contiene tabulazioni, ritorni a capo e altri controlli i cui effetti invisibili possono interrompere l'inquadratura o la visualizzazione. La lettera `é` è U+00E9, ben al di fuori dell'intervallo di controllo, quindi UTF-8 JSON può includerla direttamente tra virgolette. Lo stesso vale per la maggior parte degli script, dei simboli e delle emoji.
La fuga dall'Unicode ordinario è quindi facoltativa, non un requisito di pulizia. `"café"` e `"caf\u00e9"` decodificano con la stessa sequenza di caratteri. Il testo diretto è solitamente più facile da leggere per le persone, mentre gli escape possono aiutare un trasporto solo ASCII o rendere visibile un'unità di codice specifica. I personaggi di controllo sono diversi: la loro fuga è obbligatoria.
Come funzionano le fughe \uXXXX
Come funzionano gli escape `\uXXXX`: `u` deve essere seguito esattamente da quattro cifre esadecimali, utilizzando 0–9 o A–F in entrambi i casi. `\u00E9` rappresenta l'unità di codice UTF-16 per `é` e `\u000A` rappresenta un avanzamento riga. Meno cifre, parentesi graffe come `\u{1F600}` o una lettera non esadecimale rendono JSON non valido, anche se un altro linguaggio di programmazione accetta tale notazione.
I caratteri sopra U+FFFF sono rappresentati in questo modulo di escape come coppia surrogata. L'emoji 😀 può essere scritto come `\uD83D\uDE00`: il surrogato alto e basso si combinano dopo l'analisi in un unico valore scalare Unicode. La grammatica JSON può contenere un escape surrogato non accoppiato, ma i codificatori e le applicazioni downstream potrebbero rifiutarlo o sostituirlo perché non identifica un carattere Unicode completo.
Esempio funzionante: escape di un percorso Windows e di uno snippet di HTML
Esempio funzionante: escape di un percorso Windows e di uno snippet di HTML: il percorso previsto `C:\Temp\report.txt` richiede che ogni barra rovesciata sia raddoppiata nell'origine JSON: `"C:\\Temp\\report.txt"`. Senza il raddoppio, `\T` è un escape non valido e sequenze come `\r` o `\t` possono diventare silenziosamente caratteri di controllo anziché separatori di percorso. Costruisci JSON dal valore previsto, non indovinando quali barre visualizzate appartengono già a una lingua esterna.
Un frammento HTML come `<a title="Report">Open</a>` può mantenere letteralmente le parentesi angolari e la barra, ma le virgolette degli attributi devono diventare `\"` all'interno della stringa JSON. Se un ritorno a capo separa due tag, codificalo come `\n`. Il membro JSON risultante può essere convalidato e ricondotto al testo HTML originale.
Dove le fughe raddoppiano
Dove gli escape vengono raddoppiati: ogni grammatica del testo che racchiude ha la propria possibilità di interpretare le barre rovesciate. Un documento JSON contenente la stringa decodificata `line1\nline2` deve sfuggire alla barra rovesciata, producendo `"line1\\nline2"`. Se il testo JSON è esso stesso memorizzato come una stringa JSON, le sue virgolette ed entrambe le barre rovesciate necessitano di un altro livello di escape. L'apparente disordine registra molteplici rappresentazioni, non una speciale forma estesa di JSON.
Le shell e i valori letterali del linguaggio di programmazione aggiungono le proprie regole di virgolette prima che un parser JSON veda l'argomento. Diagnosticare dall'interno: scrivere prima l'esatto valore decodificato, codificarlo come JSON una volta, quindi codificare il testo completo JSON per la shell circostante o la lingua di origine. Ad ogni confine, controlla quali byte o caratteri riceve effettivamente il parser successivo.
Ciò che questo non copre
Ciò non copre: le entità HTML come `"` e la codifica percentuale URL come `%20` sono trasformazioni separate per contesti sintattici separati. Un parser JSON non decodifica nessuno dei due moduli. La stringa `"""` contiene sei caratteri letterali dopo l'analisi, non virgolette, e `"%20"` contiene un segno di percentuale seguito da due cifre, non uno spazio. Applica queste codifiche solo quando i dati entrano nel componente HTML o in un componente URL.
Inoltre, questa discussione non sostituisce la codifica dell'output. Un JSON valido ricevuto da una fonte non attendibile può comunque contenere HTML, testo simile a script o sequenze di controllo del terminale come normali dati di stringa. L'applicazione che successivamente esegue il rendering o esegue un comando deve gestire tale destinazione in modo sicuro. L'escape di JSON protegge la struttura JSON; non è una sanificazione universale.
Da asporto: sfuggire a ciò che la grammatica vieta, niente di più
Conclusione: sfuggire a ciò che la grammatica vieta, niente di più: virgolette doppie, barre rovesciate e punti di codice sotto U+0020 richiedono attenzione all'interno delle stringhe JSON. L'Unicode ordinario può rimanere leggibile, mentre `\uXXXX` fornisce un'alternativa esatta a quattro cifre e le coppie surrogate rappresentano i caratteri sopra U+FFFF. Una diagnostica su una posizione apparentemente vuota spesso identifica un carattere di nuova riga, tabulazione o altro carattere di controllo letterale che deve essere sostituito con il relativo escape testuale.
Conta i livelli di codifica invece di contare le barre a vista. Inizia dal valore che l'applicazione dovrebbe ricevere, codificalo una volta per JSON e solo dopo cita il documento risultante per qualsiasi shell esterna, file sorgente o seconda stringa JSON. Convalida il testo presentato al parser JSON e, quando la correttezza è importante, controlla successivamente la stringa decodificata.