Come sfuggire alle doppie virgolette in JSON


306

Sto cercando di mostrare le virgolette doppie ma mostra una delle barre rovesciate:

"maingame": {
    "day1": {
        "text1": "Tag 1",
        "text2": "Heute startet unsere Rundreise \\\"Example text\\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
    }
}

Quando si esegue il rendering in HTML, viene visualizzato come \"Example text\". Qual è il modo corretto?

Risposte:


446

Prova questo:

"maingame": {
  "day1": {
    "text1": "Tag 1",
     "text2": "Heute startet unsere Rundreise \" Example text\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
  }
}

(solo una barra rovesciata ( \) davanti alle virgolette).


9
@DWGuru questo non ha nulla a che fare con i commenti, è una sequenza di escape come descritta su ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (Par. 9 - Stringhe) dove dice: All characters may be placed within the quotation marks except for the characters that must be escapede poi specifica:\" represents the quotation mark character (U+0022)
mastazi

Per qualche motivo, questo non funziona con JSON.parse () in JS.
SacWebDeveloper il

32

Quando e dove utilizzare \\\"invece. OK, se sei come me, ti sentirai sciocco come quando ho capito cosa stavo facendo dopo aver trovato questa discussione.

Se stai creando un file / flusso di testo .json e importando i dati da lì, la risposta del flusso principale di una sola barra rovesciata prima delle doppie virgolette: \"è quella che stai cercando.

Tuttavia, se sei come me e stai cercando di ottenere il "Tryit Editor" di w3schools.com con virgolette doppie nell'output di JSON.parse (testo), quello che stai cercando è il triplo barra rovesciata virgolette doppie \\\". Questo perché stai costruendo la tua stringa di testo all'interno di un <script>blocco HTML e la prima doppia barra rovesciata inserisce una singola barra rovesciata nella variabile stringa, quindi la seguente virgoletta doppia barra rovesciata inserisce la virgoletta doppia nella stringa in modo che la stringa di script risultante contenga il \"da la risposta standard e il parser JSON analizzeranno questo come solo le doppie virgolette.

<script>
  var text="{";
  text += '"quip":"\\\"If nobody is listening, then you\'re likely talking to the wrong audience.\\\""';
  text += "}";
  var obj=JSON.parse(text);
</script>

+1: poiché è una stringa di testo JavaScript, funzionerebbe anche una doppia virgoletta con una doppia barra rovesciata \\"; perché la doppia virgoletta non deve essere salvata all'interno di una singola stringa tra virgolette, ad esempio, '\"'e '"'risulta nella stessa stringa JS.


Questa soluzione aiuta in una versione Swift a creare una stringa aggiunta agli argomenti per un POST JSON.
Nick N,

18

Sta mostrando la barra rovesciata perché stai anche sfuggendo alla barra rovesciata.

Oltre alle doppie virgolette, devi anche evitare le barre rovesciate se vuoi includerne una nella stringa tra virgolette JSON. Tuttavia, se hai intenzione di usare una barra rovesciata in una sequenza di escape, ovviamente non dovresti evitarlo.


9

Si noti che ciò si verifica più spesso quando il contenuto è stato "doppia codifica", il che significa che l'algoritmo di codifica è stato accidentalmente chiamato due volte.

La prima chiamata codificherà il valore "text2":

DA: Heute startet unsere Rundreise "Esempio di testo". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

A: Heute startet unsere Rundreise \ "Esempio di testo \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Una seconda codifica la converte nuovamente, sfuggendo ai caratteri già sfuggiti:

DA: Heute startet unsere Rundreise \ "Esempio di testo \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

PER: Heute startet unsere Rundreise \\\ "Esempio di testo \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Quindi, se sei responsabile per l'implementazione del server qui, controlla che non ci siano due passaggi per provare a codificare lo stesso contenuto.


6
Credo che anche l'encoder sfuggirebbe all'interruttore di escape, quindi penso che il tuo secondo TO: dovrebbe leggere: "Heute startet unsere Rundreise \\\" Esempio di testo \\\ ". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
Jonathan Mee

1
@Jonathan Mee: ho appena modificato la risposta in base al tuo suggerimento. È stato teoricamente scritto correttamente con 3 barre rovesciate, ma stackoverflow utilizza anche barre rovesciate per la quotazione e ha convertito le prime due barre rovesciate in una singola barra rovesciata
huha,

5

se vuoi sfuggire alla doppia virgoletta in JSON usa \\ per sfuggire.

esempio se si desidera creare json del seguente oggetto javascript

{time: '7 "o" clock'}

allora devi scrivere nel modo seguente

'{"time":"7 \\"o\\" clock"}'

se lo analizziamo usando JSON.parse()

JSON.parse('{"time":"7 \\"o\\" clock"}')

il risultato sarà

{time: "7 "o" clock"}

1

Per sfuggire alle barre rovesciate che causano problemi ai dati JSON utilizzo questa funzione.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};

6
Vorrei incoraggiare i programmatori a codificare il contenuto, invece di rimuovere (o "pulire") il contenuto. C'era l'idea di "ripulire" i dati del database, specialmente rimuovendo le virgolette singole ('). I programmatori non si rendevano conto che le persone non potevano usare il proprio cognome (O'Doul). Spero che i programmatori di oggi utilizzino altri mezzi per ottenere il contenuto originale nel database senza rimuovere o pulire i dati.
DanBaker,

Ok ho rimosso la parte di stripping del personaggio per placare le masse. @DanBaker tieni presente che la rimozione del testo dei personaggi potrebbe essere l'unico modo per rendere sicuro JS in un'app client. Per impostazione predefinita, Angular igienizza l'output HTML per questo motivo.
mbokil,

Sono d'accordo al 100% che ci sono volte in cui i dati devono essere disinfettati ... e XSS è una di quelle volte. Grazie per averlo sottolineato.
DanBaker,

0

Per coloro che desiderano utilizzare lo sviluppatore PowerShell. Ecco le linee da aggiungere alle tue settings.json:

"terminal.integrated.automationShell.windows": "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "-noe",
    "-c",
    " &{Import-Module 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell b7c50c8d} ",
    ],
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.