not json_util example docs python json pymongo

json_util - python mongodb



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

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:

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

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 arreglarlo. Cualquier consejo sería apreciado.


  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"'',''''))


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 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"}

Usar ast te impedirá que tengas comillas simples y problemas con comas finales.

json.dumps con comillas simples

Para usar json.dumps con comillas simples, puede 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.


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''}]


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á intentando load un dict Python, y json.loads está esperando una json string válida que debería tener <type ''str''> .

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.