Einfache Anführungszeichen und Schlüssel ohne Anführungszeichen in JSON

In JSON sind nur gerade doppelte Anführungszeichen (", U+0022) erlaubt, und zwar um alle Texte und um alle Schlüssel. Einfache Anführungszeichen ('), Schlüssel ohne Anführungszeichen und typografische Zeichen wie „ “ ” machen das Dokument ungültig. Der Grund: Der Standard (RFC 8259 / ECMA-404) kennt keine andere Schreibweise für Texte. In der Praxis kennst du einfache Quotes aus JavaScript und Python, deshalb passiert der Fehler so oft. Die Suche nach „json single quotes“ endet meistens hier.

Um die Stelle zu finden, fügst du den Text in den JSON-Formatierer ein. Er nennt Zeile und Spalte und erklärt den Fehler auf Deutsch. Dein Text bleibt dabei im Browser: formatierer.de verarbeitet alles lokal und sendet nichts an einen Server.

Einfache Anführungszeichen

{ 'name': 'Ada', 'sprachen': ['de', 'en'] }

Alle ' müssen " werden:

{ "name": "Ada", "sprachen": ["de", "en"] }

Die Fehlermeldung hängt von der Stelle und vom Programm ab, der Wortlaut ändert sich zudem zwischen Versionen. Typische Beispiele:

  • Chrome und Node.js (V8): bei einem Schlüssel etwa Expected property name or '}' in JSON at position 2. Steht das ' an einer anderen Stelle, kommt Unexpected token ''', ... is not valid JSON oder ähnlich.
  • Firefox: JSON.parse: expected property name or '}' mit Zeile und Spalte.
  • Python: Expecting property name enclosed in double quotes bei Schlüsseln, Expecting value bei Werten.

Die Position zeigt auf das erste einfache Anführungszeichen. Behebst du es, meldet der Parser das nächste. Das ist mühsam; ersetze deshalb alle auf einmal.

Nicht blind ersetzen

„Suchen und Ersetzen“ von ' durch " funktioniert nur, wenn kein Text selbst ein Apostroph oder Anführungszeichen enthält:

{ 'satz': 'It's "fine"' }

Hier ergäbe ein pauschales Ersetzen "It"s "fine"" – wieder kaputt. Im Text muss " als \" geschrieben werden, das ' darf dort stehen bleiben:

{ "satz": "It's \"fine\"" }

Bei mehr als ein paar Zeilen lässt du das besser ein Programm erledigen (siehe unten). Mehr zu Escape-Sequenzen steht im Ratgeber Sonderzeichen in JSON escapen.

Schlüssel ohne Anführungszeichen

{ name: "Ada", aktiv: true }

In JavaScript sind das gültige Objekt-Schlüssel, in JSON nicht. Jeder Schlüssel braucht Anführungszeichen:

{ "name": "Ada", "aktiv": true }

Chrome meldet hier Expected property name or '}' in JSON at position 2, Python Expecting property name enclosed in double quotes: line 1 column 3 (char 2). Auch Schlüssel, die nur aus Ziffern bestehen, müssen als Text geschrieben werden: "1": "eins", nicht 1: "eins".

Dasselbe gilt für Werte wie True, None oder undefined. Die gibt es in JSON nicht; erlaubt sind true, false und null.

Typografische Anführungszeichen

Dieser Fall ist heimtückisch, weil du den Fehler kaum siehst:

{ “name”: “Ada” }

Die Zeichen “ (U+201C) und ” (U+201D) sehen fast aus wie ", sind aber andere Zeichen. Dasselbe gilt für das deutsche „, für ‘ und ’ sowie für « und ». Sie entstehen, wenn Programme beim Tippen oder Einfügen automatisch „schöne“ Quotes einsetzen, etwa Word, Outlook, Pages, Notizen-Apps, manche Chat-Programme wie Slack oder Teams, Wikis und Blog-Editoren. Auch aus PDFs und Webseiten kopierter Beispielcode ist oft betroffen.

Der Parser meldet den Fehler direkt am ersten dieser Zeichen. Bei { “name”: “Ada” } meldet Chrome zum Beispiel Expected property name or '}' in JSON at position 2, also genau an der Stelle des “. Wundere dich nicht, wenn die Fehlerstelle auf ein Zeichen zeigt, das für dich wie ein normales Anführungszeichen aussieht.

So gehst du vor:

  1. Ersetze „, “, ” durch " und ‘, ’ durch ' (oder durch ", wenn sie einen Text begrenzen).
  2. Schalte die automatische Ersetzung ab oder umgehe sie. Texteditoren für Code (VS Code, Sublime Text, Vim) setzen keine typografischen Quotes. Beim Weitergeben von JSON in Chat-Programmen hilft meist ein Codeblock mit drei Backticks, weil dort normalerweise nichts ersetzt wird. Prüfe das Ergebnis trotzdem.
  3. Gib JSON besser als Datei weiter statt als Text in einem Dokument oder einer Mail.

Ähnlich unsichtbar sind geschützte Leerzeichen (U+00A0), die beim Kopieren aus Dokumenten mitkommen können. Als Whitespace erlaubt JSON nur Leerzeichen, Tab, Zeilenumbruch (LF) und Wagenrücklauf (CR).

JavaScript-Objekt in JSON umwandeln

Ein JavaScript-Objektliteral ist nicht automatisch JSON. Das Objekt lebt im Speicher; JSON ist ein Text. Der sichere Weg ist JSON.stringify():

const obj = { name: 'Ada', aktiv: true, sprachen: ['de', 'en'] };
console.log(JSON.stringify(obj, null, 2));

Ausgabe:

{
  "name": "Ada",
  "aktiv": true,
  "sprachen": [
    "de",
    "en"
  ]
}

Das zweite Argument null bedeutet „keine Filterung“, 2 ist die Einrückung. Du kannst das auch in der Browser-Konsole (F12) oder mit Node.js erledigen. Das geht schnell, ist aber nur für Code sinnvoll, dem du vertraust, weil er ausgeführt wird:

node -e "console.log(JSON.stringify({ name: 'Ada', aktiv: true }, null, 2))"

Beachte beim Umwandeln, was JSON.stringify() ändert: undefined, Funktionen und Symbole als Objekt-Werte verschwinden, NaN und Infinity werden zu null, ein Date wird zu einem Text. Die Details stehen im Ratgeber JSON-Fehler finden und beheben.

Füge niemals unbekannte Daten in eval() oder in einen Konsolenaufruf ein, nur um sie „zu parsen“. Das führt Code aus.

Python-Dictionary

print(daten) erzeugt Pythons eigene Schreibweise mit ', True und None. Das ist kein JSON. Verwende json.dumps():

import json

daten = {"name": "Ada", "aktiv": True, "titel": None}
print(json.dumps(daten, indent=2, ensure_ascii=False))

Hast du nur den Python-Text (zum Beispiel aus einem Log) und keinen Zugriff auf das Objekt, liest ast.literal_eval() ihn sicher ein. Anders als eval() führt es keinen Code aus:

import ast, json

text = "{'name': 'Ada', 'aktiv': True, 'titel': None}"
print(json.dumps(ast.literal_eval(text), indent=2))

Kein Code zur Hand: JSON5

Das Format JSON5 erlaubt einfache Quotes, Schlüssel ohne Quotes, Kommentare und ein Komma am Ende. Es ist aber kein JSON: Normale Parser lehnen es ab. Wenn du eine Datei in dieser Schreibweise hast, kannst du sie mit einer JSON5-Bibliothek einlesen und als JSON wieder ausgeben. Für Konfigurationsdateien lohnt sich das, für Daten, die zwischen Systemen laufen, nicht. Dort gilt: Wer JSON erwartet, bekommt striktes JSON.

Danach prüfen

Auch nach dem Ersetzen können andere Fehler übrig sein. Typisch sind ein Komma am Ende (siehe Komma am Ende in JSON) oder Kommentare. Füge das Ergebnis deshalb noch einmal in den JSON-Formatierer ein. Ist es gültig, siehst du es sauber eingerückt. Sonst zeigt er die nächste Fehlerstelle.

Kurz gesagt

  • JSON erlaubt nur gerade doppelte Anführungszeichen ("), für Texte und für Schlüssel.
  • Einfache Quotes und Schlüssel ohne Quotes sind JavaScript- oder Python-Schreibweise, aber kein JSON.
  • Typografische Quotes („ “ ”) stammen oft aus Word, Mails oder Chats. Du siehst sie kaum, der Parser meldet sie trotzdem.
  • Ersetze nicht pauschal ' durch ": Apostrophe und Anführungszeichen innerhalb von Texten brauchen ein eigenes Escaping.
  • Erzeuge JSON mit JSON.stringify() oder json.dumps(), statt Objekte per Hand abzutippen oder zu drucken.

Weiterlesen: JSON-Fehler finden und beheben, „Unexpected token“ in JSON, Komma am Ende in JSON, Sonderzeichen in JSON escapen und der JSON-Formatierer.