2013-03-26 40 views
213

Ich versuche doppelte Anführungszeichen zu zeigen, aber es zeigt eine der Schrägstriche:Wie doppelte Anführungszeichen in JSON zu entkommen

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

Wenn in der HTML-Rendering zeigt es als \"Example text\". Was ist der richtige Weg?

Antwort

304

Try this:

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

(nur ein Backslash (\) vor Anführungszeichen).

+0

einziger Kommentar wird – DWGuru

+3

@DWGuru nicht funktioniert dies nichts mit Kommentaren zu tun hat, dann ist es eine Escape-Sequenz wie bei https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404 beschrieben .pdf (Par. 9 - Strings), wo es heißt: 'Alle Zeichen können in die Anführungszeichen gesetzt werden, mit Ausnahme der Zeichen, die maskiert werden müssen" ' – mastazi

16

Es zeigt den Backslash, weil Sie auch den Backslash umgehen.

Neben doppelten Anführungszeichen müssen Sie auch umgekehrte Schrägstriche zurückgeben, wenn Sie eine in die Zeichenfolge in JSON in Anführungszeichen einschließen möchten. Wenn Sie jedoch einen umgekehrten Schrägstrich in einer Escape-Sequenz verwenden möchten, sollten Sie natürlich nicht entkommen.

6

Beachten Sie, dass dies am häufigsten auftritt, wenn der Inhalt "doppelt codiert" wurde, was bedeutet, dass der Verschlüsselungsalgorithmus versehentlich zweimal aufgerufen wurde.

Der erste Aufruf würde die "text2" Wert kodieren:

AB: Heute startet Unsere Rundreise "Beispieltext". Jeden Tag wird ein neues Reiseziel angesagt bis wir.

AN: Heute startet unsere Rundreise \ "Beispieltext \". Jeden Tag wird ein neues Reiseziel angesagt bis wir.

Eine zweite Codierung wandelt sie dann wieder, die bereits geschützten Zeichen entweichenden:

QUELLE: Heute startet Unsere Rundreise \ "Beispieltext \". Jeden Tag wird ein neues Reiseziel angesagt bis wir.

AN: Heute startet unsere Rundreise \\\ "Beispieltext \\\". Jeden Tag wird ein neues Reiseziel angesagt bis wir.

Also, wenn Sie für die Implementierung des Servers hier verantwortlich sind, überprüfen Sie, dass es nicht zwei Schritte versuchen, den gleichen Inhalt zu verschlüsseln.

+5

Ich glaube dass der Encoder auch den Escape-Schalter verlassen würde, also denke ich, dein zweites ** TO: ** sollte lauten: "Heute startet unsere Rundreise" Beispieltext \\\ ". Jeden Tag wird ein neues Reiseziel angesagt bis wir. –

+0

double \\ funktioniert gut für mich – DWGuru

+0

@ Jonathan Mee: Just editiert die Antwort nach Ihrem Vorschlag. Es wurde theoretisch korrekt mit 3 Backslashes geschrieben, aber stackoverflow verwendet auch Backslashes zum Angeben und Konvertieren der ersten beiden Backslashes in einen einzigen Backslash – huha

0

Um Backslashes zu umgehen, die Probleme für JSON-Daten verursachen, verwende ich diese Funktion.

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

Ich würde Programmierer dazu ermutigen, den Inhalt zu kodieren, anstatt den Inhalt zu entfernen (oder "zu bereinigen"). Früher gab es diese Idee der "Bereinigung" von Datenbankdaten - insbesondere das Entfernen von einfachen Anführungszeichen ('). Programmierer wussten nicht, dass Leute ihren eigenen Nachnamen nicht benutzen konnten (O'Doul). Ich hoffe, dass heutige Programmierer andere Mittel verwenden, um den ursprünglichen Inhalt in die Datenbank zu bringen, ohne Daten zu bereinigen oder zu bereinigen. – DanBaker

+0

Ok, ich habe den Charakter-Stripping-Teil entfernt, um die Massen zu beschwichtigen. @DanBaker bedenken Sie, dass das Entfernen von Text von Zeichen die einzige Möglichkeit ist, JS in einer Client-App sicher zu machen. Angular bereinigt aus diesem Grund standardmäßig die HTML-Ausgabe. – mbokil

+0

Ich stimme 100% zu, es gibt Zeiten, in denen Daten bereinigt werden müssen ... und XSS ist eine dieser Zeiten. Danke, dass du auf dieses eine hinweist. – DanBaker

10

Wann und wo zu verwenden \\\" statt. OK, wenn Sie wie ich sind, werden Sie sich genauso albern fühlen wie ich, als ich realisierte, was ich tat, nachdem ich diesen Thread gefunden hatte.

Wenn Sie eine .json Textdatei/Stream erstellen und die Daten von dort importieren, dann ist die Hauptströmungsantwort von nur einem umgekehrten Schrägstrich vor den doppelten Anführungszeichen: \" ist diejenige, die Sie suchen.

Allerdings, wenn Sie wie ich sind und Sie versuchen, die w3schools.com "Trypit Editor" zu haben doppelte Anführungszeichen in der Ausgabe der JSON.parse (Text), dann die, die Sie suchen für ist der dreifache Backslash doppelte Anführungszeichen \\\".Dies liegt daran, dass Sie Ihre Textzeichenfolge in einem HTML-Block erstellen und der erste umgekehrte Schrägstrich einen einzelnen umgekehrten Schrägstrich in die Zeichenfolgenvariable einfügt. Das folgende umgekehrte Schrägstrich-Anführungszeichen fügt das doppelte Anführungszeichen in die Zeichenfolge ein, sodass die resultierende Skriptzeichenfolge die Zeichenfolge enthält \" von der Standardantwort und der JSON-Parser wird dies als nur die Anführungszeichen analysieren.

<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: da es ein Text-String JavaScript, um eine doppelte Backslash doppelte Anführungszeichen \\" würde arbeiten; weil das doppelte Anführungszeichen innerhalb einer einzelnen Anführungszeichenfolge nicht maskiert werden muss, z. B. '\"' und '"' Ergebnis in der gleichen JS-Zeichenfolge.

1

Wenn Sie doppelte Anführungszeichen in JSON vermeiden möchten, verwenden Sie \\, um es zu umgehen.

Beispiel, wenn Sie wollen json schaffen, die folgenden JavaScript-Objekt

{time: '7 "o" clock'} 

dann Sie in folgenden Weise

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

schreiben müssen, wenn wir es JSON.parse()

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

Ergebnis mit parsen wird

0 sein
{time: "7 "o" clock"} 
Verwandte Themen