JSON ValueError: Esperando nombre de propiedad: línea 1 columna 2 (carácter 1)

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.

Cita única cuestión

Utilicé una cadena json con comillas simples :

 { 'property': 1 } 

Pero json.loads solo acepta comillas dobles para las propiedades de json :

 { "property": 1 } 

Cuestión de coma final

json.loads no acepta una coma final:

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

Solución: 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.

json.dumps con comillas simples

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)) 

documentación de ast

ast Python 3 doc

ast Python 2 doc

Espero que ayude.

  1. Reemplace todas las comillas simples con comillas dobles
  2. 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'}]