Ich habe versucht, einen guten Weg zu finden, um JSON-Objekte in Python zu laden. Ich sende diese JSON-Daten:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
zum Backend, wo es als String empfangen wird, habe ich dann verwendet json.loads(data)
dann analysiert.
Aber jedes Mal bekam ich die gleiche Ausnahme:
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Ich habe es gegoogelt, aber außer dieser Lösung scheint nichts zu funktionieren json.loads(json.dumps(data))
die mir persönlich nicht so effizient erscheint, da sie jede Art von Daten akzeptiert, auch solche, die nicht im JSON-Format vorliegen.
Anregungen werden sehr geschätzt.
json.dumps()
Python, anstatt nur zu schreiben, und hoffen Sie, dass die Python-Notation in Ihrem JavaScript-Reader funktioniert.print(jsonpickle_deserialized_object_string)
und versucht habe, es zu verwenden. Aus irgendeinem Grundprint()
ändert die Zitate aus"
zu'
Antworten:
Dies:
ist nicht JSON.
Dies:
ist JSON.
EDIT:
Einige Kommentatoren schlugen vor, dass das oben genannte nicht ausreicht.
JSON-Spezifikation - RFC7159 gibt an, dass eine Zeichenfolge mit einem Anführungszeichen beginnt und endet. Das ist
"
.Einzelne Quoute
'
hat in JSON keine semantische Bedeutung und ist nur innerhalb einer Zeichenfolge zulässig.quelle
Da JSON nur das Einschließen von Zeichenfolgen in doppelte Anführungszeichen zulässt, können Sie die Zeichenfolge folgendermaßen bearbeiten:
Dadurch werden alle Vorkommen von einfachen Anführungszeichen durch doppelte Anführungszeichen in der JSON-Zeichenfolge ersetzt
str
.Sie können auch verwenden,
js-beautify
was weniger streng ist:quelle
In meinem Fall waren doppelte Anführungszeichen kein Problem.
Das letzte Komma gab mir die gleiche Fehlermeldung.
Um dieses Komma zu entfernen, habe ich einen einfachen Code geschrieben.
Und das hat bei mir funktioniert.
quelle
echo '{"json":"obj",}' | python -m json.tool
Wenn in der Shell ausgeführt, wird "Erwarteter Eigenschaftsname in doppelten Anführungszeichen eingeschlossen: Zeile 1, Spalte 15 (Zeichen 14)" angegeben. Nachgestellte Kommas sind kein legales JSON, aber es wäre schön, wenn das Python-JSON-Modul in diesem Fall eine relevante Fehlermeldung ausgeben würde.Ganz einfach, diese Zeichenfolge ist kein gültiger JSON. Wie der Fehler besagt, müssen JSON-Dokumente doppelte Anführungszeichen verwenden.
Sie müssen die Datenquelle festlegen.
quelle
Ich habe Ihre JSON-Daten überprüft
in http://jsonlint.com/ und die Ergebnisse waren:
Wenn Sie es in die folgende Zeichenfolge ändern, wird der JSON-Fehler behoben:
quelle
JSON-Zeichenfolgen müssen doppelte Anführungszeichen verwenden. Die JSON-Python-Bibliothek erzwingt dies, sodass Sie Ihre Zeichenfolge nicht laden können. Ihre Daten müssen folgendermaßen aussehen:
Wenn Sie dies nicht tun können, können Sie
ast.literal_eval()
stattdessen verwendenjson.loads()
quelle
json.loads()
ast.literal_eval
führt dazu,ValueError: malformed string
dass die JSON-Zeichenfolge einen booleschen Wert hat.Dies wird das Problem lösen.
quelle
Wie es fälschlicherweise klar heißt, sollten Namen in doppelte Anführungszeichen anstatt in einfache Anführungszeichen gesetzt werden. Die übergebene Zeichenfolge ist einfach kein gültiger JSON. Es sollte so aussehen
quelle
Ich habe diese Methode verwendet und es geschafft, die gewünschte Ausgabe zu erhalten. mein Skript
Ausgabe
quelle
Das hat bei mir sehr gut funktioniert. Vielen Dank.
quelle
Dies ist zwar die richtige Lösung, aber es kann zu Kopfschmerzen führen, wenn es einen JSON wie diesen gibt -
Haben Sie diesen "wahren" Wert bemerkt ? Verwenden Sie diese Option, um sicherzustellen, dass die Dinge doppelt auf Boolesche Werte überprüft werden. Dies wird diese Fälle abdecken -
Stellen Sie außerdem sicher, dass Sie nicht machen
Es muss eine andere Variable sein.
quelle
Ich hatte ein ähnliches Problem. Zwei miteinander kommunizierende Komponenten verwendeten eine Warteschlange.
Die erste Komponente hat json.dumps nicht ausgeführt, bevor die Nachricht in die Warteschlange gestellt wurde. Die durch das Empfangen der Komponente generierte JSON-Zeichenfolge stand also in einfachen Anführungszeichen. Dies verursachte einen Fehler
Durch das Hinzufügen von json.dumps wurde das korrekt formatierte JSON erstellt und das Problem behoben.
quelle
Verwenden Sie die
eval
Funktion.Es wird die Diskrepanz zwischen einfachen und doppelten Anführungszeichen behoben.
quelle
Wie die anderen Antworten gut erklären, tritt der Fehler aufgrund ungültiger Anführungszeichen auf, die an das json-Modul übergeben wurden.
In meinem Fall habe ich den ValueError auch nach dem Ersetzen
'
durch"
in meiner Zeichenfolge weiterhin erhalten. Endlich wurde mir klar, dass einige zitierähnliche Unicode-Symbole ihren Weg in meine Zeichenfolge gefunden hatten:Um all dies zu bereinigen, können Sie Ihren String einfach durch einen regulären Ausdruck führen:
quelle
Ich bin mehrmals auf dieses Problem gestoßen, als der JSON von Hand bearbeitet wurde. Wenn jemand etwas aus der Datei löschen sollte, ohne es zu bemerken, kann dies den gleichen Fehler auslösen.
Wenn beispielsweise Ihr letztes JSON "}" fehlt, wird derselbe Fehler ausgegeben.
Wenn Sie Ihre Datei von Hand bearbeiten, stellen Sie sicher, dass Sie sie so formatieren, wie es vom JSON-Decoder erwartet wird. Andernfalls tritt das gleiche Problem auf.
Hoffe das hilft!
quelle
Es ist immer ideal, die
json.dumps()
Methode zu verwenden. Um diesen Fehler zu beseitigen, habe ich den folgenden Code verwendetquelle