Estoy teniendo problemas para usar json.loads para convertir a un objeto dict y no puedo entender qué estoy haciendo mal. El error exacto que obtengo al ejecutar esto es
ValueError: Expecting property name: line 1 column 2 (char 1)
Aquí está mi código:
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)
Estoy bastante seguro de que el error está ocurriendo en la línea 2 a la última
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
Pero no sé qué hacer para solucionarlo. Cualquier consejo sería apreciado.
json.loads
cargará una cadena json en un dict
python, json.dumps
un dict
python en una cadena json, por ejemplo:
>>> 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}'
Entonces, esa línea es incorrecta, ya que estás intentando load
un dict
Python, y json.loads
espera una json string
válida que debería tener
.
Por lo tanto, si está intentando cargar el json, debe cambiar lo que está cargando para que se parezca al json_string
arriba, o debería estar json_string
. Esta es mi mejor estimación de la información dada. ¿Qué es lo que estás tratando de lograr?
Además, no es necesario que especifique la u
antes de las cadenas, como @Cld menciona en los comentarios.
Encontré otro problema que devuelve el mismo error.
Utilicé una cadena json con comillas simples :
{ 'property': 1 }
Pero json.loads
solo acepta comillas dobles para las propiedades de json :
{ "property": 1 }
json.loads
no acepta una coma final:
{ "property": "text", "property2": "text2", }
ast
para resolver comillas simples y problemas de coma final Puede usar ast
(parte de la biblioteca estándar para Python 2 y 3) para este procesamiento. Aquí hay un ejemplo :
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"}
El uso de ast
le impedirá que tenga comillas simples y problemas de coma final al interpetar el JSON como el diccionario de Python (por lo que debe seguir la syntax del diccionario de Python). Es una muy buena y segura alternativa de la función eval()
para estructuras literales.
La documentación de Python nos advirtió de usar una cadena grande / compleja:
Advertencia Es posible bloquear el intérprete de Python con una cadena suficientemente grande / compleja debido a las limitaciones de profundidad de stack en el comstackdor AST de Python.
Para usar json.dumps
con comillas simples fácilmente puedes usar este código:
import ast import json data = json.dumps(ast.literal_eval(json_data_single_quote))
ast
ast Python 3 doc
ast Python 2 doc
Espero que ayude.
reemplace ‘u “‘ de sus cadenas a ‘”‘ … así que básicamente convierta los unicodes internos a cadenas antes de cargar la cadena en json
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"',''))
Todas las demás respuestas pueden responder a su consulta, pero me encontré con el mismo problema que se debió a la desviación ,
que agregué al final de mi cadena json de esta manera:
{ "key":"123sdf", "bus_number":"asd234sdf", }
Finalmente lo puse en funcionamiento cuando quité extra ,
como este:
{ "key":"123sdf", "bus_number":"asd234sdf" }
¡Espero que esto ayude! aclamaciones.
ast usado, ejemplo
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'}]