Je ne parviens pas à utiliser json.loads pour convertir un objet dict et je ne comprends pas ce que je fais mal
ValueError: Expecting property name: line 1 column 2 (char 1)
Voici mon code:
__author__ = 'xxdpavelxx'
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)
Je suis à peu près sûr que l'erreur se produit à la fin de la deuxième ligne
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
mais je ne sais pas quoi faire pour le réparer. Tout avis sera le bienvenu.
json.loads
chargera une chaîne json dans un python dict
, json.dumps
dumpera un python dict
dans une chaîne json, par exemple:
>>> 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}'
Donc, cette ligne est incorrecte puisque vous essayez de load
un python dict
, et json.loads
attend un json string
valide qui devrait avoir <type 'str'>
.
Donc, si vous essayez de charger le JSON, vous devriez changer ce que vous chargez pour qu'il ressemble au json_string
ci-dessus, ou vous devriez le vider. Ceci est juste ma meilleure estimation de l'information donnée. Qu'est-ce que vous essayez d'accomplir?
De plus, vous n'avez pas besoin de spécifier la variable u
avant vos chaînes, comme indiqué par @Cld dans les commentaires.
J'ai rencontré un autre problème qui renvoie la même erreur.
J'ai utilisé une chaîne json avec single quotes:
{
'property': 1
}
Mais json.loads
accepte uniquement les guillemets doubles pour les propriétés json:
{
"property": 1
}
json.loads
n'accepte pas de virgule finale:
{
"property": "text",
"property2": "text2",
}
ast
pour résoudre les problèmes de devis simple et de virgule finaleVous pouvez utiliser ast
(partie de la bibliothèque standard pour Python 2 et 3) pour ce traitement. Voici un exemple :
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"}
Utiliser ast
vous évitera des problèmes de devis simple et de virgule finale.
Pour utiliser facilement json.dumps
avec guillemets simples, vous pouvez utiliser ce code:
import ast
import json
data = json.dumps(ast.literal_eval(json_data_single_quote))
ast
documentationJ'espère que ça aide.
Toutes les autres réponses peuvent répondre à votre requête, mais j'ai rencontré le même problème qui était dû à ,
, que j'ai ajouté à la fin de ma chaîne json, comme ceci:
{
"key":"123sdf",
"bus_number":"asd234sdf",
}
Je l'ai finalement fait fonctionner quand j'ai enlevé un ,
supplémentaire comme ceci:
{
"key":"123sdf",
"bus_number":"asd234sdf"
}
J'espère que cette aide! à votre santé.
utilisé ast, exemple
In [15]: a = "[{'start_city': '1', 'end_city': 'aaa', 'number': 1},\
...: {'start_city': '2', 'end_city': 'bbb', 'number': 1},\
...: {'start_city': '3', 'end_city': 'ccc', 'number': 1}]"
In [16]: import ast
In [17]: ast.literal_eval(a)
Out[17]:
[{'end_city': 'aaa', 'number': 1, 'start_city': '1'},
{'end_city': 'bbb', 'number': 1, 'start_city': '2'},
{'end_city': 'ccc', 'number': 1, 'start_city': '3'}]