Ich habe Probleme mit json.loads in ein dict-Objekt zu konvertieren und ich kann nicht herausfinden, was ich falsch mache.
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 2. bis letzten Zeile auftritt
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
aber ich weiß nicht, was ich tun soll, um ihn zu beheben. Für jeden Ratschlag wäre ich dankbar.
Ich bin auf ein anderes Problem gestoßen, das denselben Fehler verursacht.
Ich habe einen json-String mit einfachen Anführungszeichen verwendet:
{
'property': 1
}
Aber json.loads
akzeptiert nur doppelte Anführungszeichen für json-Eigenschaften:
{
"property": 1
}
json.loads
akzeptiert kein abschließendes Komma:
{
"property": "text",
"property2": "text2",
}
ast
zur Lösung der Probleme mit einfachen Anführungszeichen und abschließenden KommasSie können ast
(Teil der Standardbibliothek sowohl für Python 2 als auch 3) für diese Verarbeitung verwenden. Hier ist ein Beispiel:
import ast
# ast.literal_eval() return a dict object, we must use json.dumps to get JSON string
import json
# Single quote to double with ast.literal_eval()
json_data = "{'property': 'text'}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}
# ast.literal_eval() with double quotes
json_data = '{"property": "text"}'
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}
# ast.literal_eval() with final coma
json_data = "{'property': 'text', 'property2': 'text2',}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property2": "text2", "property": "text"}
Die Verwendung von ast
verhindert Probleme mit einfachen Anführungszeichen und abschließenden Kommas, indem das JSON wie ein Python-Wörterbuch verarbeitet wird (Sie müssen also die Python-Wörterbuchsyntax befolgen). Es ist eine ziemlich gute und sichere Alternative zur Funktion eval()
für literale Strukturen.
1 der Python-Dokumentation1 wird vor der Verwendung großer/komplexer Strings gewarnt:
Warnung Es ist möglich, den Python-Interpreter zum Absturz zu bringen mit einer ausreichend großen/komplexen String zum Absturz bringen, da die Stapeltiefe in Pythons AST-Compiler.
Um json.dumps
mit einfachen Anführungszeichen zu verwenden, können Sie diesen Code verwenden:
import ast
import json
data = json.dumps(ast.literal_eval(json_data_single_quote))
ast
DokumentationWenn Sie häufig JSON bearbeiten, können Sie CodeBeautify verwenden. Es hilft Ihnen, Syntaxfehler zu beheben und JSON zu minifizieren/verschönern.
Ich hoffe, es hilft.
json.loads" lädt einen json-String in einen Python-Dict", json.dumps" gibt einen Python-Dict" in einen json-String aus, zum Beispiel:
>>> json_string = '{"favorited": false, "contributors": null}'
'{"favorited": false, "contributors": null}'
>>> value = json.loads(json_string)
{u'favorited': False, u'contributors': None}
>>> json_dump = json.dumps(value)
'{"favorited": false, "contributors": null}'
Diese Zeile ist also falsch, da Sie versuchen, ein Python dict
zu laden
, und json.loads
erwartet einen gültigen json string
, der <type 'str'>
haben sollte.
Wenn Sie also versuchen, den json zu laden, sollten Sie das, was Sie laden, so ändern, dass es wie der obige json_string
aussieht, oder Sie sollten es ausgeben. Dies ist nur meine beste Vermutung anhand der gegebenen Informationen. Was versuchen Sie zu erreichen?
Außerdem müssen Sie das "u" vor Ihren Strings nicht angeben, wie @Cld in den Kommentaren erwähnte.
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))