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.
- Reemplace todas las comillas simples con comillas dobles
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
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.