web-dev-qa-db-fra.com

JSON ValueError: Nom de propriété attendu: ligne 1 colonne 2 (caractère 1)

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.

64
dredbound

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.

68
Yep_It's_Me

J'ai rencontré un autre problème qui renvoie la même erreur.

Numéro de citation unique

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
}

Question de virgule finale

json.loads n'accepte pas de virgule finale:

{
  "property": "text", 
  "property2": "text2",
}

Solution: ast pour résoudre les problèmes de devis simple et de virgule finale

Vous 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.

json.dumps avec des guillemets simples

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 documentation

ast Python 3 doc

ast Python 2 doc

J'espère que ça aide.

124
jedema

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é.

3
Rishabh Agrahari

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'}]
0
xin.chen