Mein Code:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
Definition ist falsch
#2
Definition ist richtig
Ich habe gehört, dass in Python dieses einfache und doppelte Anführungszeichen austauschbar sein können. Kann mir das jemand erklären?
str(dict)
und will es nichteval
. Ein einfacher.replace("'", '"')
sollte den Trick machen.json.dumps(..)
zweimal anrufen wie in:import json; d = dict(tags=["dog", "cat", "mouse"]); print json.dumps(json.dumps(d))
was ergibt:"{\"tags\": [\"dog\", \"cat\", \"mouse\"]}"
Sie können verwenden
ast.literal_eval()
quelle
{ 'a' : 'this "string" really isn\'t!!!!' }
"{'link':'<a href="mylink">http://my.com</a>'}"
. In diesem Fallast.literal_eval
wirft SyntaxfehlerSie können JSON mit doppeltem Anführungszeichen ausgeben, indem Sie:
quelle
demjson ist auch ein gutes Paket, um das Problem der schlechten json-Syntax zu lösen:
Verwendung:
Bearbeiten:
quelle
demjson.decode
ist ein großartiges Tool für beschädigten JSON - aber für Aufgaben mit Zehntausenden oder Hunderttausenden von JSON-Paketenast.literal_eval
ist es viel schneller. Um nicht zu sagen, esdemjson
hat keinen Platz: Ich benutze es als Fallback für den Fall, dass schnellere Methoden fehlschlagen.Bisher zwei Probleme mit Antworten, wenn beispielsweise eines solche nicht standardmäßige JSON-Streams überträgt. Denn dann muss man möglicherweise eine eingehende Zeichenfolge interpretieren (kein Python-Wörterbuch).
demjson
Problem 1 - : Mit Python 3.7. + Und unter Verwendung von conda konnte ich demjson nicht installieren, da Python> 3.5 derzeit offensichtlich nicht unterstützt wird. Ich brauche also eine Lösung mit einfacheren Mitteln, zum Beispielast
und / oderjson.dumps
.Problem 2 -
ast
&json.dumps
: Wenn ein JSON in einfachen Anführungszeichen steht und eine Zeichenfolge in mindestens einem Wert enthält, der wiederum einfache Anführungszeichen enthält, besteht die einzige einfache und dennoch praktische Lösung darin, beide anzuwenden:Im folgenden Beispiel nehmen wir an, dass
line
es sich um das eingehende JSON-Zeichenfolgenobjekt handelt:Schritt 1: Konvertieren Sie die eingehende Zeichenfolge mithilfe von
ast.literal_eval()
Schritt 2 in ein Wörterbuch. Wenden
json.dumps
Sie darauf die zuverlässige Konvertierung von Schlüsseln und Werten an, ohne jedoch den Inhalt von Werten zu berühren :json.dumps
allein würde den Job nicht machen, weil es den JSON nicht interpretiert, sondern nur den String sieht. Ähnliches gilt fürast.literal_eval()
: Obwohl es das JSON (Wörterbuch) korrekt interpretiert, konvertiert es nicht das, was wir brauchen.quelle
Sie können dies folgendermaßen beheben:
quelle
Wie gesagt, JSON ist keine Python-Syntax. Sie müssen in JSON doppelte Anführungszeichen verwenden. Sein Schöpfer ist (un) berühmt dafür, strenge Teilmengen der zulässigen Syntax zu verwenden, um die kognitive Überlastung des Programmierers zu verringern.
Das Folgende kann fehlschlagen, wenn eine der JSON-Zeichenfolgen selbst ein einfaches Anführungszeichen enthält, wie von @Jiaaro hervorgehoben. VERWENDE NICHT. Links hier als Beispiel für das, was nicht funktioniert.
Es ist sehr nützlich zu wissen, dass eine JSON-Zeichenfolge keine einfachen Anführungszeichen enthält. Angenommen, Sie haben es von einer Browserkonsole / was auch immer kopiert und eingefügt. Dann können Sie einfach tippen
Dies könnte sonst brechen, wenn auch einfache Anführungszeichen verwendet werden.
quelle
{"key": "value 'with' single quotes"}
Es hat mein Problem mit der Bewertungsfunktion wirklich gelöst.
quelle
Ich bin kürzlich auf ein sehr ähnliches Problem gestoßen und glaube, dass meine Lösung auch für Sie funktionieren würde. Ich hatte eine Textdatei, die eine Liste der Elemente im Formular enthielt:
Ich wollte das Obige in eine Python-Liste zerlegen, war aber nicht an eval () interessiert, da ich der Eingabe nicht vertrauen konnte. Ich habe zuerst versucht, JSON zu verwenden, aber es werden nur Elemente in doppelten Anführungszeichen akzeptiert. Daher habe ich meinen eigenen, sehr einfachen Lexer für diesen speziellen Fall geschrieben.
Hoffentlich ist es jemandem nützlich. Genießen!
quelle
Funktioniert bei mir
quelle
Das obige Code-Snippet sollte funktionieren.
quelle