J'ai du mal à utiliser json.loads pour convertir en un objet dict et je ne peux pas comprendre ce que je fais mal.
ValueError: Expecting property name: line 1 column 2 (char 1)
Voici mon 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)
Je suis presque sûr que l'erreur se produit entre la deuxième et la dernière ligne
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
mais je ne sais pas quoi faire pour y remédier. Tout avis sera le bienvenu.
"
erreur est-ce une erreur de copier-coller?print tweet.message.value
?ValueError
est envoyé en raison d'une erreur dans l'entrée JSON, pas d'un problème dans votre code. (À côté des disparus"
qui devraient normalement envoyer unSyntaxError
, je suppose que c'est juste une erreur de copier-coller.)Réponses:
json.loads
chargera une chaîne json dans un pythondict
,json.dumps
videra un pythondict
dans une chaîne json, par exemple:Donc, cette ligne est incorrecte puisque vous essayez
load
un pythondict
, etjson.loads
attendez un validejson string
qui devrait avoir<type 'str'>
.Donc, si vous essayez de charger le json, vous devez changer ce que vous chargez pour qu'il ressemble à ce qui
json_string
précède, ou vous devriez le vider. C'est juste ma meilleure estimation à partir des informations fournies. Qu'est-ce que vous essayez d'accomplir?De plus, vous n'avez pas besoin de spécifier le
u
avant vos chaînes, comme @Cld l'a mentionné dans les commentaires.la source
J'ai rencontré un autre problème qui renvoie la même erreur.
Problème de devis unique
J'ai utilisé une chaîne json avec des guillemets simples :
Mais
json.loads
n'accepte que les guillemets doubles pour les propriétés json :Dernier problème de virgule
json.loads
n'accepte pas une virgule finale:Solution:
ast
pour résoudre les problèmes de guillemets simples et de virgules finalesVous pouvez utiliser
ast
(une partie de la bibliothèque standard pour Python 2 et 3) pour ce traitement. Voici un exemple :L'utilisation
ast
vous évitera les problèmes de guillemets simples et de virgules finales en interprétant le dictionnaire JSON comme Python (vous devez donc suivre la syntaxe du dictionnaire Python). C'est une alternative deeval()
fonction assez bonne et sûre pour les structures littérales.La documentation Python nous a avertis de l'utilisation d'une chaîne volumineuse / complexe:
json.dumps avec des guillemets simples
Pour utiliser
json.dumps
facilement les guillemets simples, vous pouvez utiliser ce code:ast
Documentationast Python 3 doc
ast Python 2 doc
Outil
Si vous modifiez fréquemment JSON, vous pouvez utiliser CodeBeautify . Il vous aide à corriger les erreurs de syntaxe et à minimiser / embellir JSON.
J'espère que cela aide.
la source
la source
Toutes les autres réponses peuvent répondre à votre requête, mais j'ai rencontré le même problème qui était dû à un écart
,
que j'ai ajouté à la fin de ma chaîne json comme ceci:Je l'ai finalement fait fonctionner lorsque j'ai supprimé un supplément
,
comme celui-ci:J'espère que cette aide! à votre santé.
la source
utilisé ast, exemple
la source
Un cas différent dans lequel j'ai rencontré cela était lorsque j'utilisais
echo
pour diriger le JSON dans mon script python et que j'enveloppais négligemment la chaîne JSON entre guillemets:Notez que la chaîne JSON elle-même a des guillemets et j'aurais dû faire:
En fait, voici ce que le script python a reçu
{thumbnailWidth: 640}
:; les guillemets doubles ont été effectivement supprimés.la source