Skip to content
Zurück zum Blog
Tutorials

JSON-Strings escapen: Zeichen, Stringify und Fallstricke

Wie man einen String in JSON escapet: welche Zeichen escapet werden müssen, der Unterschied zu JSON.stringify, JSON-in-JSON-Verschachtelung, Unicode-Escapes und häufige Fallstricke.

9 Min. Lesezeit

JSON-Strings escapen: Zeichen, Stringify und Fallstricke

Einen JSON-String zu escapen bedeutet, beliebigen Text in eine Zeichenkette zu verwandeln, die sicher als String-Literal in einem JSON-Dokument stehen kann. Eine Handvoll Zeichen tragen strukturelle Bedeutung oder sind innerhalb eines JSON-Strings schlicht unzulässig: das doppelte Anführungszeichen, der Backslash und Steuerzeichen wie Zeilenumbruch und Tabulator. Jedes davon wird durch eine sichere Escape-Sequenz wie \", \\ oder \n ersetzt. Macht man das falsch, lässt sich die Payload nicht mehr parsen.

Das begegnet Ihnen ständig: Ein JSON-Objekt als String-Feld in ein anderes verschachteln, ein mehrzeiliges Code-Snippet in einen Konfigurationswert einfügen oder einen REST-Request-Body für curl von Hand bauen. Dieser Leitfaden zeigt genau, welche Zeichen escapet werden müssen, räumt mit der Verwirrung zwischen Escaping und JSON.stringify auf, führt durch JSON-in-JSON-Verschachtelung und Unicode-Escapes und listet die Fallstricke auf, die Payloads klammheimlich zerstören. Wenn Sie einfach nur sofort etwas escapen möchten, erledigt das unser Tool JSON maskieren direkt im Browser. Lesen Sie aber weiter, wenn Sie verstehen wollen, warum es funktioniert, wie es funktioniert.

Was ist JSON-String-Escaping?

JSON-String-Escaping ist der Vorgang, eine rohe Zeichenkette in eine Form zu überführen, die sich sicher in ein JSON-Dokument einbetten lässt. JSON reserviert eine kleine Menge an Zeichen mit struktureller Bedeutung: Das doppelte Anführungszeichen " begrenzt einen String, und der Backslash \ leitet eine Escape-Sequenz ein. Hinzu kommt, dass Steuerzeichen unterhalb von U+0020 wie Zeilenumbrüche, Tabulatoren und Wagenrückläufe überhaupt nicht buchstäblich innerhalb eines JSON-Strings vorkommen dürfen. Escaping ersetzt jedes davon durch eine sichere Sequenz, sodass die resultierende Zeichenkette überall sauber geparst wird.

Wann brauchen Sie es tatsächlich? Ein paar Situationen tauchen immer wieder auf:

  • JSON-in-JSON: Ein Webhook-Umschlag, eine Kafka-Nachricht oder ein Audit-Log speichert einen Request-Body als String-Feld, also muss das innere JSON escapet werden, bevor es zugewiesen werden kann.
  • Handgeschriebene Konfiguration: Ein mehrzeiliges Shell-Skript, eine SQL-Abfrage oder ein Code-Snippet in einen einzigen JSON-Wert zu packen, bedeutet, jeden Zeilenumbruch in \n zu verwandeln.
  • REST-Request-Bodies: Einen JSON-Body von Hand für curl oder einen HTTP-Client bauen, wobei Anführungszeichen und Zeilenumbrüche die Shell und die Übertragung überstehen müssen.
  • Log-sichere Kodierung: Vom Benutzer gelieferten Inhalt in eine strukturierte Log-Zeile schreiben, ohne dass ein eingeschleustes Anführungszeichen oder ein Zeilenumbruch das Format zerstört.

Ein kurzes Wort zur Reihenfolge der Schritte. Wenn Sie von unordentlichem oder nicht vertrauenswürdigem JSON ausgehen, validieren Sie es zuerst, damit Sie etwas Wohlgeformtes escapen. Fügen Sie es in den JSON-Formatierer ein, um es zu formatieren und zu prüfen, und escapen Sie dann das saubere Ergebnis. Müll zu escapen liefert Ihnen nur escapeten Müll.

Welche Zeichen müssen in JSON escapet werden

Die JSON-Spezifikation definiert eine präzise, kurze Liste. Sieben Zeichen haben ein dediziertes zweistelliges Escape, und alles andere unterhalb von U+0020 fällt auf ein \uXXXX-Unicode-Escape zurück. Hier ist der vollständige Satz an JSON-Escape-Zeichen:

ZeichenEscapet zuAnmerkungen
" (U+0022)\"String-Begrenzer
\ (U+005C)\\Escape-Einleitung (der Fall json escape backslash)
Zeilenumbruch (U+000A)\n
Wagenrücklauf (U+000D)\r
Tabulator (U+0009)\t
Backspace (U+0008)\b
Seitenvorschub (U+000C)\f
sonstige Steuerzeichen < U+0020\uXXXXz. B. U+0000 → \u0000

Was nicht escapet werden muss, ist genauso wichtig. Der Schrägstrich / ist ein völlig normales Zeichen (ihn zu escapen ist optional und nur in einem engen, weiter unten behandelten Fall nützlich). Einfache Anführungszeichen müssen nie escapet werden, weil JSON sie nicht als Begrenzer verwendet. Und jedes druckbare Zeichen ab U+0020 ist unverändert gültig, einschließlich aller Mehrbyte-UTF-8-Zeichen wie é, oder 😀.

Hier ist der Unterschied konkret gemacht. Die rohe Eingabe links, das escapete JSON-String-Literal rechts:

Input:
She said "hello"	then left.

Escaped:
"She said \"hello\"\tthen left."

Die doppelten Anführungszeichen wurden zu \" und der Tabulator wurde zu \t. Jetzt ist die Zeichenkette sicher und lässt sich in jeden JSON-Parser, jede Log-Zeile oder jeden Request-Body einfügen.

JSON Escape vs. JSON Stringify: Was ist der Unterschied?

Das ist der Punkt, den die meisten Tutorials überspringen, und er verwirrt viele Menschen. Escaping und JSON.stringify sind nicht zwei verschiedene Operationen, sondern zwei Blickwinkel auf dieselbe.

JSON.stringify(value) serialisiert einen beliebigen JavaScript-Wert in seine JSON-Textdarstellung. Wenn dieser Wert zufällig ein String ist, bedeutet das Serialisieren, ihn in doppelte Anführungszeichen zu setzen und die Sonderzeichen darin zu escapen. Genau das ist JSON-Escaping. Also gibt JSON.stringify("a\tb") die sieben Zeichen lange Zeichenkette "a\tb" zurück, Anführungszeichen inbegriffen.

Die praktische Frage ist, ob Sie diese äußeren Anführungszeichen haben möchten. Das entspricht direkt der Option In doppelte Anführungszeichen einschließen im Tool JSON maskieren:

ModusAusgabe für Eingabe a"bWann verwenden
Einschließen an"a\"b"Ein vollständiges JSON-String-Literal, identisch mit JSON.stringify. Weisen Sie es einer Variablen zu oder fügen Sie es nach einem Doppelpunkt ein.
Einschließen ausa\"bNur der escapete Rumpf, ohne umgebende Anführungszeichen. Verwenden Sie das, wenn Sie die Anführungszeichen in einem JSON-Dokument selbst tippen.

Wenn Sie also nach „json stringify” gesucht haben und hier gelandet sind, ist das mentale Modell einfach: einen String stringifizieren = Escaping mit „Einschließen an”. Die Form ohne Anführungszeichen ist dasselbe, nur mit abgezogenen äußeren Anführungszeichen.

Wie man in Code einen String für JSON escapet

Die goldene Regel: Bauen Sie niemals eine Kette von replace()-Aufrufen von Hand. Jede gängige Sprache liefert einen JSON-Serialisierer mit, der Anführungszeichen, Backslashes, Steuerzeichen und Unicode korrekt behandelt. Greifen Sie darauf zurück.

JavaScript

const text = 'She said "hi"\nthen left.';
const escaped = JSON.stringify(text);
console.log(escaped);
// "She said \"hi\"\nthen left."

JSON.stringify liefert bei einem String das vollständige, in Anführungszeichen gesetzte Literal. Sie möchten nur den Rumpf? Schneiden Sie das erste und letzte Zeichen ab: JSON.stringify(text).slice(1, -1).

Python

import json

text = 'She said "hi"\nthen left.'
print(json.dumps(text))
# "She said \"hi\"\nthen left."

print(json.dumps(text, ensure_ascii=False))
# "She said \"hi\"\nthen left."  (non-ASCII kept as UTF-8)

json.dumps verwendet standardmäßig ensure_ascii=True, was jedes Nicht-ASCII-Zeichen zu \uXXXX escapet, also dasselbe Verhalten wie der ASCII-sichere Modus des Tools. Übergeben Sie ensure_ascii=False, um rohes UTF-8 zu behalten.

PHP

<?php
$text = "café \"quoted\"\nline";
echo json_encode($text);
// "caf\u00e9 \"quoted\"\nline"  (default escapes non-ASCII to \uXXXX)

echo json_encode($text, JSON_UNESCAPED_UNICODE);
// "café \"quoted\"\nline"

json_encode escapet standardmäßig sowohl Nicht-ASCII-Zeichen als auch Schrägstriche. Fügen Sie JSON_UNESCAPED_UNICODE hinzu, um Akzente lesbar zu halten, und JSON_UNESCAPED_SLASHES, um / in Ruhe zu lassen.

Go und Java

In Go gibt json.Marshal(text) die escapeten, in Anführungszeichen gesetzten Bytes zurück:

b, _ := json.Marshal(`a "quoted" line`)
// b == `"a \"quoted\" line"`

In Java erzeugen Jacksons objectMapper.writeValueAsString(text) oder JSONObject.quote(text) aus org.json dasselbe in Anführungszeichen gesetzte Literal. Egal welche Sprache: Verlassen Sie sich auf die Bibliothek. Sie kennt bereits jeden Sonderfall, den Sie vergessen würden.

JSON in JSON einbetten (JSON-in-JSON)

Das ist der mit Abstand häufigste Grund, warum Menschen JSON von Hand escapen. Ein Webhook-Umschlag, ein Message-Queue-Eintrag oder ein Audit-Log speichert oft einen ganzen Request-Body als String-Feld. Dafür muss das innere JSON zuerst escapet werden.

Beobachten Sie ein kleines Objekt auf seiner Reise durch zwei Kodierungsebenen:

1. Inner object:        {"a":1}
2. Escaped as a string: "{\"a\":1}"
3. Placed in envelope:  {"payload": "{\"a\":1}"}

Jedes " im inneren Objekt wurde zu \", und das Ganze wurde in ein äußeres Paar Anführungszeichen gewickelt. Das Ergebnis ist ein einziger gültiger String-Wert, den Sie payload zuweisen können.

Der Haken bei tieferer Verschachtelung ist, dass sich Backslashes vermehren. Ein bereits escapetes Zeichenkette zu escapen escapet auch deren Backslashes, sodass sich diese mit jeder Ebene grob verdoppeln: Ein inneres Anführungszeichen, das \" war, wird eine Ebene weiter draußen zu \\\" und noch eine Ebene weiter zu \\\\\". Drei Ebenen tiefes JSON-in-JSON ist wirklich schwer zu lesen, weshalb ein Tool hilft. Um die andere Richtung einzuschlagen und das innere Objekt wieder aus dem String herauszuholen, schicken Sie es durch unser Tool JSON entmaskieren.

Unicode und \uXXXX-Escaping

Standardmäßig ist JSON mit rohem UTF-8 zufrieden. Ein é bleibt ein é, ein bleibt ein , und das Dokument ist dadurch besser lesbar. Sie müssen kein druckbares Unicode-Zeichen escapen.

Wann würden Sie also zur ASCII-sicheren \uXXXX-Ausgabe greifen? Nur wenn einem nachgelagerten System UTF-8 nicht zugemutet werden kann: alte SOAP- oder XML-Gateways, bestimmte Logging-Pipelines, E-Mail-Header oder Quelldateien, die reines ASCII bleiben müssen. Im ASCII-sicheren Modus wird jedes Zeichen über U+007F zu einem \uXXXX-Escape, sodass aus café ein caf\u00e9. Das ist lauter, aber Byte für Byte ASCII, und es dekodiert in jedem konformen Parser zurück zum Original.

Es gibt eine Feinheit. \uXXXX kodiert eine einzelne 16-Bit-UTF-16-Codeeinheit, aber Zeichen außerhalb der Basic Multilingual Plane, etwa Emojis oder seltene Schriften, brauchen 21 Bit. JSON behandelt sie mit einem Surrogatpaar: zwei \uXXXX-Escapes hintereinander. Ein grinsendes Gesicht 😀 (U+1F600) wird zu \ud83d\ude00. Die meisten Serialisierer machen das für Sie; die Gefahr ist ein handgeschriebener Escaper, der ein einzelnes, ungepaartes Surrogat ausgibt.

Wenn Surrogatpaare und Codepunkte für Sie Neuland sind, schlüsselt der UTF-8 vs UTF-16 vs Unicode Encoding-Guide genau auf, wie ein einzelnes Zeichen auf Bytes und Codeeinheiten abgebildet wird. Es ist der fehlende Kontext dahinter, warum ein Emoji zwei Escapes braucht.

Entmaskieren: Escapetes JSON zurücklesen

Escaping hat eine Umkehrung. Um "a\tb" zurück in den echten zwei-zeiligen oder tabulierten Text zu verwandeln, parsen Sie es: JSON.parse(str) in JavaScript, json.loads(str) in Python. Der Parser durchläuft jede Escape-Sequenz und baut die ursprünglichen Zeichen wieder auf, Surrogatpaare inbegriffen.

Wenn das Entmaskieren fehlschlägt, lautet der Fehler fast immer „invalid escape sequence”, und er hat ein paar übliche Ursachen:

  • Ein einzelner Backslash vor einem Zeichen, das JSON nicht als Escape erkennt, wie \q.
  • Ein erfundenes Escape wie \x41, denn JSON hat kein \x-Hex-Escape und verwendet nur \u.
  • Ein abgeschnittenes \u-Escape mit weniger als vier Hexadezimalstellen, wie \u00.
  • Ein verirrtes oder unausgeglichenes doppeltes Anführungszeichen, das die String-Grenze zerstört.

Prüfen Sie, dass jeder Backslash eines der gültigen Escapes einleitet (\n \r \t \b \f \" \\ \/ \uXXXX) und dass die Anführungszeichen paarweise vorliegen. Für escapete Strings, die aus der Mitte einer Log-Zeile herauskopiert wurden, wo die äußeren Anführungszeichen zurückgelassen wurden, akzeptiert unser Tool JSON entmaskieren den Rumpf mit oder ohne umgebende Anführungszeichen und dekodiert ihn in beiden Fällen.

Häufige Fallstricke beim JSON-Escaping

Die meisten kaputten Payloads lassen sich auf einen dieser sechs Fehler zurückführen.

1. Doppeltes Escaping. Text zu escapen, der bereits escapet war, verwandelt \n in \\n und \" in \\\", sodass der Konsument ein buchstäbliches Backslash-n statt eines Zeilenumbruchs liest. Das passiert meist, wenn ein vorgelagerter Dienst den Wert bereits JSON-escapet hat und Sie ihn erneut escapen. Entmaskieren Sie zuerst, um den aktuellen Zustand zu prüfen, und escapen Sie dann genau einmal.

2. Die äußeren Anführungszeichen vergessen. Mit „Einschließen aus” erhalten Sie nur den escapeten Rumpf, keinen vollständigen String. hello \"world\" direkt dorthin einzufügen, wo ein JSON-Wert erwartet wird, ist ungültig, weil die umgebenden Anführungszeichen fehlen. Lassen Sie entweder „Einschließen an” oder tippen Sie die Anführungszeichen selbst.

3. Übermäßiges Escaping von Nicht-ASCII. Den ASCII-sicheren Modus einzuschalten, wenn der Konsument UTF-8 problemlos verarbeitet, bläht die Ausgabe nur auf. café wird ohne Grund zu caf\u00e9, was schwerer zu lesen und bei der Übertragung größer ist, ohne dass es etwas bringt. Lassen Sie ihn aus, es sei denn, ein bestimmtes Altsystem verlangt reines ASCII.

4. Den Schrägstrich aus Reflex escapen. Das /-Escape ist an genau einer Stelle relevant: JSON, das innerhalb eines HTML-&lt;script&gt;-Tags eingebettet ist, wo die Teilzeichenfolge &lt;/script&gt; das Tag unabhängig vom JSON-Kontext vorzeitig schließen würde. / zu \/ zu escapen neutralisiert das. Außerhalb dieses einen Falls ist das Escapen von Schrägstrichen reine Unordnung. Lassen Sie es bei REST-Bodies, Konfigurationsdateien und Nachrichten-Payloads aus.

5. Handgebaute replace-Ketten. Eine manuelle replace('"', '\\"')-Pipeline vergisst fast immer etwas, sei es ein Steuerzeichen, ein Backspace oder ein Surrogatpaar. Verwenden Sie den Serialisierer der Sprache, der die gesamte Spezifikation abdeckt.

6. Escapen, aber nie entmaskieren (oder zweimal entmaskieren). Ein Hin-und-Rück muss ausgewogen sein. Escapen Sie einmal auf dem Weg hinein, entmaskieren Sie einmal auf dem Weg hinaus. Entmaskieren Sie zweimal, und Sie verstümmeln echte Backslashes, die Teil der Daten waren.

Eine weitere wichtige Unterscheidung: JSON-Escaping ist nicht URL- oder Prozentkodierung. Sie lösen unterschiedliche Probleme für unterschiedliche Transportwege, und sie zu vermischen (einen Wert prozentkodieren und dann das Ergebnis JSON-escapen, oder umgekehrt) erzeugt ein Durcheinander, das kein Parser sauber lesen kann. Der URL-Encoding und -Decoding Guide behandelt, wann Prozentkodierung das richtige Werkzeug ist und wie sie sich von dem unterscheidet, was JSON tut.

Häufig gestellte Fragen

Was bedeutet es, einen String in JSON zu escapen?

Es bedeutet, die Zeichen mit struktureller Bedeutung für JSON, also das doppelte Anführungszeichen, den Backslash und Steuerzeichen wie Zeilenumbruch und Tabulator, durch sichere Escape-Sequenzen wie \", \\ und \n zu ersetzen. Das Ergebnis lässt sich als String-Literal in ein JSON-Dokument einbetten, ohne den Parse-Vorgang zu zerstören.

Welche Zeichen müssen in JSON escapet werden?

Das doppelte Anführungszeichen, der Backslash, der Zeilenumbruch, der Wagenrücklauf, der Tabulator, der Backspace und der Seitenvorschub bekommen jeweils ein dediziertes Escape, und jedes andere Steuerzeichen unterhalb von U+0020 wird zu \uXXXX. Druckbare Zeichen und Mehrbyte-UTF-8 brauchen kein Escaping; der Schrägstrich ist optional und nur innerhalb von HTML-&lt;script&gt;-Tags relevant.

Ist JSON Escape dasselbe wie JSON.stringify?

Größtenteils zwei Blickwinkel auf eine Operation. JSON.stringify auf einen String angewendet setzt ihn in doppelte Anführungszeichen und escapet die Sonderzeichen darin, und genau das ist JSON-Escaping. „Einschließen an” entspricht der Form mit Anführungszeichen (identisch mit JSON.stringify); „Einschließen aus” liefert nur den escapeten Rumpf ohne die umgebenden Anführungszeichen.

Wie escape ich einen String für JSON in JavaScript oder Python?

In JavaScript verwenden Sie JSON.stringify(str); in Python verwenden Sie json.dumps(str). Verlassen Sie sich immer auf die eingebaute Funktion statt auf eine handgeschriebene replace-Kette, denn die eingebauten Funktionen behandeln Unicode, Steuerzeichen und jeden Sonderfall korrekt, den Sie sonst übersehen würden.

Warum zerbricht mein JSON an zusätzlichen Backslashes?

Die übliche Ursache ist doppeltes Escaping: Text zu escapen, der bereits escapet war, sodass \n zu \\n wird und der Konsument ein buchstäbliches Backslash-n statt eines Zeilenumbruchs liest. Entmaskieren Sie den Wert zuerst, um seinen echten Zustand zu prüfen, und escapen Sie ihn dann genau einmal.

Muss ich Schrägstriche oder Unicode in JSON escapen?

Keines von beiden ist erforderlich. Der / ist ein normales Zeichen und muss nur escapet werden, wenn Sie JSON in ein HTML-&lt;script&gt;-Tag einbetten, um zu verhindern, dass die Sequenz &lt;/script&gt; es vorzeitig schließt. Unicode bleibt standardmäßig rohes UTF-8; verwenden Sie \uXXXX nur, wenn ein nachgelagertes System UTF-8 nicht verarbeiten kann.

Tags: JSON Encoding Data Formats JavaScript

Verwandte Artikel

Alle Artikel anzeigen