← Alle Artikel

Falsch escaptes Zeichen in JSON: Ursachen, Beispiele und Fixes

Beheben Sie „bad escaped character in JSON"-Fehler durch \x-Escapes, Windows-Pfade, Regex-Strings, fehlerhafte \u-Werte und doppelt kodiertes JSON.

SyntaxError: Bad escaped character in JSON at position N bedeutet, dass der Parser innerhalb eines JSON-Strings einen Backslash (\) gefunden hat und das nächste Zeichen keines der von JSON erlaubten Escape-Zeichen war. Gemäß RFC 8259 Abschnitt 7 dürfen JSON-Strings ein doppeltes Anführungszeichen, Backslash, Schrägstrich, die Steuer-Escapes b, f, n, r, t oder ein Unicode-Escape in der Form u plus exakt vier Hex-Ziffern escapen.

Beim echten Debugging kommt dieser Fehler meist von einem kopierten Wert: einem Windows-Pfad (C:\Users\Ada), einem JavaScript- oder Shell-Escape (\x1b), einem Regex-Muster (\d+), einem Python-Style-Unicode-Escape (\U0001F600) oder einem String, der halb aus einem Log entescape wurde. Der Fix ist nicht „Backslashes löschen". Der Fix ist, zu entscheiden, was der endgültige String-Wert sein soll, und dann den JSON-Text zu schreiben, der diesen Wert repräsentiert.

Dieser Leitfaden konzentriert sich auf die Formulierung von JavaScript JSON.parse(), aber dieselbe Regel gilt für Python json.loads(), Go encoding/json, Ruby JSON.parse, PHP json_decode, jq, Postgres jsonb und die meisten strikten JSON-Parser.

Welchen String-Fehler habe ich?

Der 30-Sekunden-Fix

  1. Springen Sie zur gemeldeten position, line oder column.
  2. Schauen Sie ein Zeichen davor nach einem Backslash.
  3. Prüfen Sie das Zeichen nach dem Backslash.
  4. Ist der Backslash Teil der Daten, schreiben Sie ihn als \\.
  5. Gehört das Escape zu einer anderen Sprache (\x, \d, \U), übersetzen Sie es in JSON-Syntax.
  6. Wurde der Backslash nur aus einer zitierten Log-Zeile kopiert, parsen Sie eine Ebene, statt ihn mit Regex zu strippen.

Beispiel:

{"path":"C:\Users\Ada\file.json"}
           ^
           U ist nach einem JSON-Backslash nicht gültig

Korrekter JSON-Text:

{
  "path": "C:\\Users\\Ada\\file.json"
}

Nach dem Parsen ist der tatsächliche Anwendungswert weiterhin:

C:\Users\Ada\file.json

Die verdoppelten Backslashes existieren nur im JSON-Text.

Wie der Fehler aussieht

Verschiedene Engines verwenden leicht unterschiedliche Formulierungen:

// V8: Chrome, Node.js, Edge
SyntaxError: Bad escaped character in JSON at position 12

// Firefox
SyntaxError: JSON.parse: bad escaped character at line 1 column 13 of the JSON data

// Safari
SyntaxError: JSON Parse error: Invalid escape character \x

V8s position zeigt normalerweise auf das Zeichen nach dem Backslash, nicht auf den Backslash selbst. In diesem kaputten JSON ist das gemeldete Zeichen das U in \Users:

{"path":"C:\Users\Ada\file.json"}
           ^^
           \U ist das schlechte Escape

Wenn die Nachricht also position 12 sagt, inspizieren Sie ein kleines Fenster vor und nach Position 12. Das schlechte Zeichen ist nützlich, aber der Backslash davor erklärt den Bug.

Die einzigen Escapes, die JSON erlaubt

Innerhalb eines JSON-Strings darf ein Backslash nur diese Escapes einleiten:

JSON-Escape Geparstes Zeichen Anmerkungen
\" " Erforderlich für ein doppeltes Anführungszeichen innerhalb eines JSON-Strings
\\ \ Erforderlich für einen literalen Backslash
\/ / Optional; / ist auch unescape gültig
\b Backspace U+0008
\f Form Feed U+000C; deshalb ist \file in Windows-Pfaden gefährlich
\n Line Feed U+000A
\r Carriage Return U+000D
\t Tab U+0009
\uXXXX Unicode-Codeeinheit Exakt vier Hex-Ziffern nach kleinem u

Alles andere ist ungültiges JSON: \x, \', \d, \s, \w, \0, \v, \e, \U, \u{1F600}, \N{...}, \cA und kurze Unicode-Escapes wie \u12.

Schnell-Fix-Tabelle

Verwenden Sie diese Tabelle, wenn Sie bereits wissen, was der endgültige Wert sein soll.

Kaputter JSON-Text Warum es fehlschlägt Gültiger JSON-Text
{ "path": "C:\Users\Ada\file.json" } \U und \A sind ungültig; \f ist gültig, wird aber zu Form Feed, nicht zu einem Pfadtrenner. { "path": "C:\\Users\\Ada\\file.json" }
{ "path": "C:/Users/Ada/file.json" } Das schlägt nicht fehl. Schrägstriche müssen nicht escapet werden. Behalten Sie es, wenn der Konsument Schrägstriche akzeptiert.
{ "color": "\x1b[32mOK\x1b[0m" } JSON hat kein \xNN-Escape. { "color": "\u001b[32mOK\u001b[0m" }
{ "name": "O\'Brien" } Apostrophe müssen in JSON-Strings nicht escapet werden. { "name": "O'Brien" }
{ "pattern": "^\d{4}-\d{2}-\d{2}$" } \d ist ein Regex-Escape, kein JSON-Escape. { "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }
{ "char": "\u12" } Auf \u müssen genau 4 Hex-Ziffern folgen. { "char": "\u0012" }
{ "emoji": "\u{1F600}" } JavaScript unterstützt das in Source-Strings; JSON nicht. { "emoji": "😀" } oder { "emoji": "\uD83D\uDE00" }

Ein unangenehmes Detail verdient eine eigene Warnung: \f ist ein gültiges JSON-Escape. Enthält ein Windows-Pfad \file, kann ein Parser das in ein Form-Feed-Zeichen gefolgt von ile umwandeln. Das Parsen kann erfolgreich sein, während der Pfadwert korrumpiert ist. Deshalb ist das blinde „Reparieren" von Pfad-Strings riskant.

Ursache 1: In JSON kopierte Windows-Pfade

Windows-Pfade sehen harmlos aus, weil Menschen den Backslash als Pfadtrenner lesen:

{ "downloadDir": "C:\Users\Ada\Downloads" }

JSON liest Backslash als Beginn einer Escape-Sequenz. Es sieht \U und stoppt, weil das Großbuchstaben-U kein JSON-Escape ist.

Schreiben Sie verdoppelte Backslashes in JSON:

{
  "downloadDir": "C:\\Users\\Ada\\Downloads"
}

Oder verwenden Sie Schrägstriche, wenn das empfangende Programm sie akzeptiert:

{
  "downloadDir": "C:/Users/Ada/Downloads"
}

Für Config-Dateien führen Schrägstriche oft zu weniger Fehlern. Für exakte Windows-only-Werte sind verdoppelte Backslashes die portable JSON-Darstellung.

Ursache 2: JavaScript-Source-Strings mit JSON-Text vermischen

Hier werden viele Beispiele im Web versehentlich verwirrend. Es gibt zwei Ebenen:

  • JavaScript-Source-String-Syntax
  • JSON-Text-Syntax innerhalb dieses JavaScript-Strings

Dieser JavaScript-Quellcode ist gültig:

const raw = '{"path":"C:\\Users\\Ada"}';
JSON.parse(raw);

Aber der JSON-Text, der den Parser erreicht, ist:

{"path":"C:\\Users\\Ada"}

Wenn Sie ein kaputtes JSON-Beispiel in JavaScript testen wollen, ohne dass JavaScript selbst zuerst die Backslashes konsumiert, verwenden Sie String.raw:

const broken = String.raw`{"path":"C:\Users\Ada"}`;
JSON.parse(broken);

Das wirft Bad escaped character, weil JSON.parse() den echten kaputten JSON-Text empfängt.

Nutzen Sie dieses Denkmodell beim Lesen von Stack Traces: Kommt das JSON aus einer .json-Datei, einem HTTP-Body, localStorage-Wert oder Datenbank-String, fixen Sie den JSON-Text. Ist das JSON innerhalb eines JavaScript-Source-Strings, brauchen Sie evtl. eine Escape-Ebene für JavaScript und eine weitere für JSON.

Ursache 3: Escapes aus anderen Sprachen leihen

JSON akzeptiert \n und \t, aber es akzeptiert viele Escapes nicht, die in Programmiersprachen normal sind:

{ "code": "\x1b[0m", "name": "O\'Brien" }

Gültiges JSON:

{
  "code": "\u001b[0m",
  "name": "O'Brien"
}

Häufige falsche Freunde:

Escape Gültig in JSON-Fix
\x1b JavaScript, Python, viele Shells \u001b
\' JavaScript/Python single-quoted Strings ' ohne Backslash verwenden
\0 JavaScript/Python NUL-Kurzform \u0000
\v JavaScript vertikaler Tab \u000b
\U0001F600 Python-Unicode-Escape Literales UTF-8-Emoji oder Surrogate-Paar
\u{1F600} JavaScript-Unicode-Codepoint-Escape Literales UTF-8-Emoji oder Surrogate-Paar

Ist der Producer Ihr eigener Code, übersetzen Sie nicht jeden Fall von Hand. Bauen Sie ein normales Objekt und lassen Sie den JSON-Serializer der Sprache gültiges JSON schreiben.

Ursache 4: Regex-Muster in JSON-Config gespeichert

Regexes haben ihre eigene Escape-Sprache. JSON-Strings haben eine separate Escape-Sprache. Der Regex-Backslash muss das JSON-Parsen überleben, bevor er die Regex-Engine erreichen kann.

Kaputte JSON-Config:

{ "datePattern": "^\d{4}-\d{2}-\d{2}$" }

Gültige JSON-Config:

{
  "datePattern": "^\\d{4}-\\d{2}-\\d{2}$"
}

Nach dem JSON-Parsen sieht die Anwendung diesen String:

^\d{4}-\d{2}-\d{2}$

Erst dann sollte er zu einem regulären Ausdruck werden:

const config = JSON.parse('{"datePattern":"^\\\\d{4}-\\\\d{2}-\\\\d{2}$"}');
const re = new RegExp(config.datePattern);

Dieselbe Regel gilt für \s, \w, \b, benannte Gruppen, Lookbehind-Beispiele und Ersetzungs-Strings. Ist der Backslash für einen späteren Parser gedacht, verdoppeln Sie ihn in JSON.

Ursache 5: Fehlerhafte Unicode-Escapes

JSONs Unicode-Escape hat feste Breite:

{ "char": "\u12" }

Gültiges JSON:

{
  "char": "\u0012"
}

Das u muss klein sein und exakt vier Hex-Ziffern folgen: 0-9, a-f oder A-F.

Diese sind keine JSON-Unicode-Escapes:

"\u{2028}"   // JavaScript-Source-Stil, nicht JSON
"\U00002028" // Python-Stil, nicht JSON
"\u20G0"     // G ist keine Hex-Ziffer

Zeichen außerhalb der Basic Multilingual Plane, wie viele Emojis und einige mathematische Symbole, können literal in UTF-8-JSON gespeichert werden:

{
  "emoji": "😀"
}

Escapet werden sie als UTF-16-Surrogate-Paar repräsentiert:

{
  "emoji": "\uD83D\uDE00"
}

Vermeiden Sie einsame Surrogates wie \uD83D ohne das passende Low-Surrogate. Manche Parser akzeptieren sie als Codeeinheiten, aber nachgelagerte Systeme, die wohlgeformtes Unicode verlangen, lehnen sie ab.

Ursache 6: Handgebaute JSON-Strings

Das ist die Produktions-Version des Bugs:

// Unsicher: userInput kann Backslashes, Quotes oder Newlines enthalten.
const payload = '{"message":"' + userInput + '"}';

Ist userInput C:\Users\Ada, ist der ausgegebene Text ungültiges JSON. Enthält er ", kann das JSON auf andere Weise brechen. Enthält er eine rohe Newline, bekommen Sie möglicherweise stattdessen ein Bad Control Character.

Verwenden Sie einen Serializer:

const payload = JSON.stringify({
  message: userInput,
  path: 'C:\\Users\\Ada\\file.json',
  code: '\x1b[32mOK\x1b[0m',
});

JSON.stringify() erledigt das JSON-spezifische Escapen. Das Ergebnis ist gültiger JSON-Text:

{
  "message": "...",
  "path": "C:\\Users\\Ada\\file.json",
  "code": "\u001b[32mOK\u001b[0m"
}

Dasselbe Prinzip gilt in anderen Sprachen:

import json

payload = json.dumps({
    "path": r"C:\Users\Ada\file.json",
    "pattern": r"^\d+$",
})
body, err := json.Marshal(map[string]string{
    "path": `C:\Users\Ada\file.json`,
    "pattern": `^\d+$`,
})

Reparieren Sie einen Producer, ist das der eigentliche Fix. Ungültiges JSON nachgelagert zu flicken, verbirgt nur die Stelle, an der der schlechte Text erzeugt wurde.

Wie man das schlechte Escape lokalisiert

Für eingefügtes JSON macht dieser kleine Helper den Bereich um V8s position besser sichtbar:

function showJsonParseContext(raw) {
  try {
    JSON.parse(raw);
    console.log('Valid JSON');
  } catch (error) {
    const message = String(error.message);
    const match = message.match(/position (\d+)/);

    if (!match) {
      console.log(message);
      return;
    }

    const pos = Number(match[1]);
    const start = Math.max(0, pos - 24);
    const end = Math.min(raw.length, pos + 24);
    const excerpt = raw.slice(start, end);

    console.log(message);
    console.log(JSON.stringify(excerpt));
    console.log(' '.repeat(pos - start) + '^');
  }
}

const raw = String.raw`{"path":"C:\Users\Ada\file.json"}`;
showJsonParseContext(raw);

JSON.stringify(excerpt) ist Absicht. Es zeigt Backslashes und Steuerzeichen als sichtbare Escapes — genau das, was Sie brauchen, wenn der Bug unsichtbarer Whitespace oder ein übereifriges Escape ist.

Für Firefox-Style-Fehler mit line und column springen Sie zuerst zu dieser Zeile und inspizieren dann das String-Literal darin. Landet die exakte Spalte hinter einem Backslash, lesen Sie auch das vorherige Zeichen.

Repair-Tool oder Payload ablehnen?

Verwenden Sie ein Repair-Tool, wenn:

  • Sie ein eingefügtes Snippet säubern.
  • Sie eine Log-Zeile debuggen.
  • Sie LLM-Output prüfen.
  • Sie den reparierten Wert visuell bestätigen können.
  • Der Wert keine Geldbewegung, Berechtigungen, Löschung oder irreversiblen Zustand steuert.

Lehnen Sie die Payload ab und fixen Sie den Producer, wenn:

  • Das JSON aus einem API-Vertrag stammt.
  • Der Wert Abrechnung, Berechtigungen, Sicherheit oder Datenlöschung beeinflusst.
  • Der Parser zwischen mehreren möglichen Bedeutungen raten musste.
  • Ein Pfad, eine Regex oder eine Escape-Sequenz gültig, aber semantisch falsch sein könnte.

Zum Beispiel ist das Reparieren von C:\Users\Ada\file.json nicht nur eine Syntax-Operation. \f in \file ist ein gültiges Escape, sodass ein Tool ein Form-Feed-Zeichen parsen könnte, statt den Backslash zu erhalten. Ein Mensch oder der Producer-Code muss den beabsichtigten Pfad entscheiden.

Das JSON-Fix-Tool auf dieser Seite eignet sich am besten als browser-lokaler Debug-Assistent: Text einfügen, Output prüfen, dann das reparierte JSON validieren. Es sollte nicht die stille Ingestion-Schicht für fehlerhafte Produktions-Payloads sein.

Wie man JSON sicher entescape

Manchmal sind die Backslashes nicht schlecht; das JSON ist doppelt kodiert. Sie sehen das vielleicht in Logs:

{\"name\":\"Ada\",\"path\":\"C:\\\\Users\\\\Ada\"}

Führen Sie kein pauschales replace(/\\/g, '') aus. Das zerstört echte Escapes.

Parsen Sie eine gültige JSON-Ebene nach der anderen:

// Der äußere Wert ist ein JSON-String, der JSON-Text enthält.
const wrapped = '"{\\"name\\":\\"Ada\\",\\"path\\":\\"C:\\\\\\\\Users\\\\\\\\Ada\\"}"';

const once = JSON.parse(wrapped);
// once ist: {"name":"Ada","path":"C:\\Users\\Ada"}

const data = JSON.parse(once);
// data ist: { name: "Ada", path: "C:\\Users\\Ada" }

Schlägt der erste Parse mit Bad escaped character fehl, ist der Input nicht bloß kodiert. Er ist ungültiger JSON-Text und braucht eine gezielte Reparatur.

Präventions-Checkliste

  • Konkatenieren Sie niemals User-Strings in JSON.
  • Verwenden Sie JSON.stringify(), json.dumps(), json.Marshal() oder den JSON-Serializer Ihrer Plattform.
  • Speichern Sie Regex-Muster in JSON mit verdoppelten Backslashes.
  • Bevorzugen Sie Schrägstriche für Pfade, wenn der Konsument sie akzeptiert.
  • Zitieren und testen Sie Beispiele, die aus Logs, Shells und Docs kopiert wurden.
  • Validieren Sie generierte .json-Dateien in CI mit einem echten Parser.
  • Loggen Sie eine sichere Vorschau um die Parser-Position, statt die ganze Payload zu loggen.
  • Behandeln Sie automatische Reparatur als Entwickler-Workflow, nicht als Produktionsvertrag.

Häufig gestellte Fragen

Was bedeutet „Bad escaped character in JSON"?

Auf einen Backslash innerhalb eines JSON-Strings folgt ein Zeichen, das JSON nach \ nicht erlaubt. Gültige Escapes sind ", \, /, b, f, n, r, t und uXXXX.

Wie fixe ich einen Windows-Pfad in JSON?

Schreiben Sie jeden Pfad-Backslash als \\, z. B. C:\\Users\\Ada\\file.json. Wenn das empfangende Programm Schrägstriche akzeptiert, ist C:/Users/Ada/file.json gültiges JSON und leichter zu lesen.

Warum funktioniert meine Regex in JavaScript, scheitert aber in JSON?

Der JSON-Parser sieht den String vor der Regex-Engine. Ein Regex-Escape wie \d muss in JSON als \\d geschrieben werden, damit der geparste String weiterhin \d enthält.

Ist \x1b gültiges JSON?

Nein. \xNN ist in JavaScript, Python und Shell-Beispielen üblich, aber JSON unterstützt es nicht. Verwenden Sie \u001b für das ANSI-ESC-Zeichen, oder entfernen Sie ANSI-Farbcodes, bevor Sie Logs serialisieren.

Ist das dasselbe wie „Bad control character"?

Nein. „Bad escaped character" bedeutet, dass das Zeichen nach einem Backslash ungültig ist. „Bad control character" bedeutet, dass ein rohes Steuerbyte, wie eine literale Newline, Tab, NUL oder ESC, innerhalb eines JSON-Strings erscheint.

Können JSON-Repair-Tools schlechte Escapes automatisch fixen?

Manchmal, für eingefügte Snippets, bei denen der beabsichtigte Wert offensichtlich ist. Reparieren Sie API-Payloads, sicherheitsrelevante Daten, Zahlungen, Berechtigungen, Löschungen oder Werte, bei denen \f, \n oder \t gültig, aber unbeabsichtigt sein könnten, nicht stillschweigend automatisch.

Wie entescape ich JSON?

Parsen Sie eine Ebene nach der anderen mit JSON.parse(). Ein doppelt kodierter Wert wird nach dem ersten Parsen zu einem normalen JSON-String und nach dem zweiten zu einem echten Objekt oder Array. Vermeiden Sie Regex-Backslash-Stripping, weil es gültige Escapes zerstört.

Wie verhindere ich diesen Fehler im Quellcode?

Bauen Sie native Werte und serialisieren Sie sie mit JSON.stringify() oder dem entsprechenden Serializer in Ihrer Sprache. Setzen Sie JSON nicht durch String-Konkatenation zusammen.

Jetzt beheben

Quellen

Zuletzt geprüft im Juli 2026.