Ich habe Probleme mit der Verwendung von json.loads zum Konvertieren in ein Diktierobjekt und kann nicht herausfinden, was ich falsch mache. Der genaue Fehler, den ich beim Ausführen bekomme, ist
ValueError: Expecting property name: line 1 column 2 (char 1)
Hier ist mein Code:
from kafka.client import KafkaClient
from kafka.consumer import SimpleConsumer
from kafka.producer import SimpleProducer, KeyedProducer
import pymongo
from pymongo import MongoClient
import json
c = MongoClient("54.210.157.57")
db = c.test_database3
collection = db.tweet_col
kafka = KafkaClient("54.210.157.57:9092")
consumer = SimpleConsumer(kafka,"myconsumer","test")
for tweet in consumer:
print tweet.message.value
jsonTweet=json.loads(({u'favorited': False, u'contributors': None})
collection.insert(jsonTweet)
Ich bin mir ziemlich sicher, dass der Fehler in der vorletzten Zeile auftritt
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
aber ich weiß nicht, was ich tun soll, um das Problem zu beheben. Jeder Rat wäre dankbar.
"
ist das ein Kopier- und Einfügefehler?print tweet.message.value
?ValueError
wird aufgrund eines Fehlers in der JSON-Eingabe gesendet, kein Problem in Ihrem Code. (Abgesehen von den Vermissten"
, die normalerweise eine senden sollten,SyntaxError
Antworten:
json.loads
lädt einen JSON-String in eine Pythondict
,json.dumps
speichert einen Pythondict
in einen JSON-String, zum Beispiel:Diese Zeile ist also falsch, da Sie versuchen,
load
eine Python zu verwendendict
, undjson.loads
eine gültige Zeile erwartet,json string
die vorhanden sein sollte<type 'str'>
.Wenn Sie also versuchen, den JSON zu laden, sollten Sie das, was Sie laden, so ändern, dass es wie
json_string
oben aussieht , oder Sie sollten es ausgeben. Dies ist nur meine beste Vermutung aus den gegebenen Informationen. Was versuchen Sie zu erreichen?Außerdem müssen Sie die
u
Zeichenfolgen nicht vor Ihren Zeichenfolgen angeben , wie @Cld in den Kommentaren erwähnt.quelle
Ich habe ein anderes Problem festgestellt, das denselben Fehler zurückgibt.
Ausgabe mit einfachem Angebot
Ich habe einen JSON-String mit einfachen Anführungszeichen verwendet :
Aber
json.loads
akzeptiert nur doppelte Anführungszeichen für json Eigenschaften :Letzte Komma-Ausgabe
json.loads
akzeptiert kein abschließendes Komma:Lösung:
ast
Lösen von Problemen mit einfachen Anführungszeichen und endgültigen KommasSie können
ast
(Teil der Standardbibliothek für Python 2 und 3) für diese Verarbeitung verwenden. Hier ist ein Beispiel :Verwenden von
ast
die können Sie Probleme mit einfachen Anführungszeichen und endgültigen Kommas vermeiden, indem Sie das JSON wie das Python-Wörterbuch interpetieren (Sie müssen also die Python-Wörterbuchsyntax befolgen). Es ist eine ziemlich gute und sichereeval()
Funktionsalternative für wörtliche Strukturen.Python-Dokumentation warnte uns vor der Verwendung großer / komplexer Zeichenfolgen:
json.dumps mit einfachen Anführungszeichen
Um es
json.dumps
einfach mit einfachen Anführungszeichen zu verwenden, können Sie diesen Code verwenden:ast
Dokumentationast Python 3 doc
ast Python 2 doc
Werkzeug
Wenn Sie JSON häufig bearbeiten, können Sie CodeBeautify verwenden . Es hilft Ihnen, Syntaxfehler zu beheben und JSON zu minimieren / zu verschönern.
Ich hoffe, es hilft.
quelle
quelle
Alle anderen Antworten beantworten möglicherweise Ihre Frage, aber ich hatte das gleiche Problem, das auf Streu zurückzuführen war,
,
das ich am Ende meiner JSON-Zeichenfolge wie folgt hinzugefügt habe:Ich habe es endlich zum Laufen gebracht, als ich extra
,
so entfernt habe:Ich hoffe das hilft! Prost.
quelle
verwendet ast, Beispiel
quelle
Ein anderer Fall, in dem ich darauf gestoßen bin, war, als ich
echo
den JSON in mein Python-Skript leitete und den JSON-String achtlos in doppelte Anführungszeichen setzte:Beachten Sie, dass die JSON-Zeichenfolge selbst Anführungszeichen enthält, und ich hätte Folgendes tun sollen:
So wie es war, erhielt das Python-Skript Folgendes :
{thumbnailWidth: 640}
; Die doppelten Anführungszeichen wurden effektiv entfernt.quelle