So vermeiden Sie doppelte Anführungszeichen in JSON

306

Ich versuche, doppelte Anführungszeichen anzuzeigen, aber es zeigt einen der Backslashes:

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

Beim Rendern im HTML wird es als angezeigt \"Example text\". Was ist der richtige Weg?

user1937021
quelle

Antworten:

446

Versuche dies:

"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).

Kamituel
quelle
9
@DWGuru das hat nichts mit Kommentaren zu tun, es ist eine Escape-Sequenz, wie unter ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (Par. 9 - Strings) beschrieben, wo es heißt: All characters may be placed within the quotation marks except for the characters that must be escapedund dann es spezifiziert:\" represents the quotation mark character (U+0022)
Mastazi
Aus irgendeinem Grund funktioniert dies nicht mit JSON.parse () in JS.
SacWebDeveloper
32

Wann und wo \\\"stattdessen zu verwenden . OK, wenn du wie ich bist, wirst du dich genauso albern fühlen wie ich, als mir klar wurde, was ich tat, nachdem ich diesen Thread gefunden hatte.

Wenn Sie eine .json-Textdatei / einen Stream erstellen und die Daten von dort importieren, lautet die Antwort des Haupt-Streams mit nur einem Backslash vor den doppelten Anführungszeichen:\" diejenige, nach der Sie suchen.

Wenn Sie jedoch wie ich sind und versuchen, den w3schools.com "Tryit Editor" dazu zu bringen, doppelte Anführungszeichen in der Ausgabe von JSON.parse (Text) zu haben, ist das gesuchte das Dreifache Backslash doppelte Anführungszeichen \\\". Dies liegt daran, dass Sie Ihre Textzeichenfolge in einem HTML- <script>Block erstellen und der erste doppelte Backslash einen einzelnen Backslash in die Zeichenfolgenvariable einfügt. Das folgende doppelte Backslash-Anführungszeichen fügt das doppelte Anführungszeichen in die Zeichenfolge ein, sodass die resultierende Skriptzeichenfolge das \"from enthält Die Standardantwort und der JSON-Parser analysieren dies nur als doppelte Anführungszeichen.

<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 sich um eine JavaScript-Textzeichenfolge handelt, würde auch ein doppeltes Backslash-Anführungszeichen \\"funktionieren. weil das doppelte Anführungszeichen nicht innerhalb einer einfachen Zeichenfolge in Anführungszeichen gesetzt werden muss, z. B. '\"'und '"'dieselbe JS-Zeichenfolge ergibt.

Gregor y
quelle
Diese Lösung hilft in einer Swift-Version beim Erstellen einer Zeichenfolge, die Argumenten für einen JSON-POST hinzugefügt wird.
Nick N
18

Es zeigt den Backslash, weil Sie auch dem Backslash entkommen.

Abgesehen von doppelten Anführungszeichen müssen Sie auch Backslashes vermeiden, wenn Sie einen in Ihre JSON-Zeichenfolge in Anführungszeichen aufnehmen möchten. Wenn Sie jedoch beabsichtigen, einen Backslash in einer Escape-Sequenz zu verwenden, sollten Sie ihn natürlich nicht maskieren.

Alex Worden
quelle
9

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

Der erste Aufruf würde den Wert "text2" codieren:

VON: Heute begann unsere Rundreise "Beispieltext". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Heute startete unsere Rundreise "Beispieltext". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Eine zweite Codierung konvertiert sie dann erneut und entgeht den bereits maskierten Zeichen:

VON: Heute startete unsere Rundreise "Beispieltext". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Heute startete unsere Rundreise \\\ "Beispieltext \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Wenn Sie hier für die Implementierung des Servers verantwortlich sind, stellen Sie sicher, dass nicht zwei Schritte ausgeführt werden, um denselben Inhalt zu codieren.

Ben
quelle
6
Ich glaube, dass der Encoder auch dem Escape-Schalter entkommen würde, daher denke ich, dass Ihr zweiter TO: lauten sollte: "Heute gestartet unsere Rundreise \\\" Beispieltext \\\ ". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
Jonathan Mee
1
@ Jonathan Mee: Bearbeiten Sie einfach die Antwort gemäß Ihrem Vorschlag. Es wurde theoretisch korrekt mit 3 Backslashes geschrieben, aber Stackoverflow verwendet auch Backslashes zum Zitieren und konvertierte die ersten beiden Backslashes in einen einzigen Backslash
huha
5

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

Beispiel, wenn Sie einen JSON des folgenden Javascript-Objekts erstellen möchten

{time: '7 "o" clock'}

dann müssen Sie folgendermaßen schreiben

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

wenn wir es mit analysieren JSON.parse()

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

Ergebnis wird sein

{time: "7 "o" clock"}
Manas
quelle
1

Um Backslashes zu vermeiden, die Probleme mit JSON-Daten verursachen, verwende ich diese Funktion.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};
mbokil
quelle
6
Ich würde Programmierer ermutigen, den Inhalt zu codieren, anstatt ihn zu entfernen (oder zu "bereinigen"). Früher gab es die Idee, Datenbankdaten zu "bereinigen" - insbesondere einfache Anführungszeichen (') zu entfernen. Programmierer erkannten nicht, dass die Leute ihren eigenen Nachnamen (O'Doul) nicht verwenden konnten. Ich hoffe, dass Programmierer von heute andere Mittel verwenden, um den ursprünglichen Inhalt in die Datenbank zu bringen, ohne Daten zu entfernen oder zu bereinigen.
DanBaker
Ok, ich habe den Charakter entfernt, um die Massen zu besänftigen. @DanBaker Denken Sie daran, dass das Entfernen von Zeichentext möglicherweise die einzige Möglichkeit ist, JS in einer Client-App sicher zu machen. Angular bereinigt aus diesem Grund standardmäßig die HTML-Ausgabe.
Mbokil
Ich stimme zu 100% zu, dass Daten manchmal bereinigt werden müssen ... und XSS ist eine dieser Zeiten. Vielen Dank, dass Sie darauf hingewiesen haben.
DanBaker
0

Für diejenigen, die Entwickler Powershell verwenden möchten. Hier sind die Zeilen, die Sie zu Ihrer settings.json hinzufügen können:

"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} ",
    ],
erikeah
quelle