Tengo 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 se produce en la 2ª a la última línea.
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
pero no sé qué hacer para solucionarlo. Se agradecería cualquier consejo.
"
error, ¿es un error de copiar y pegar?print tweet.message.value
?ValueError
envía debido a un error en la entrada JSON, no a un problema en su código. (Además de los"
que faltan, que normalmente deberían enviar un mensaje,SyntaxError
así que supongo que es solo un error de copiar y pegar)Respuestas:
json.loads
cargará una cadena json en una pythondict
,json.dumps
volcará una pythondict
a una cadena json, por ejemplo:Entonces esa línea es incorrecta ya que está intentando
load
una pythondict
, yjson.loads
espera una válidajson string
que debería tener<type 'str'>
.Entonces, si está tratando de cargar el json, debe cambiar lo que está cargando para que se vea como el
json_string
anterior, o debería descargarlo. Esta es mi mejor suposición a partir de la información proporcionada. ¿Qué es lo que está tratando de lograr?Además, no es necesario que especifique el
u
antes de sus cadenas, como @Cld mencionó en los comentarios.fuente
Encontré otro problema que devuelve el mismo error.
Emisión de comillas simples
Usé una cadena json con comillas simples :
Pero
json.loads
solo acepta comillas dobles para las propiedades json :Problema de coma final
json.loads
no acepta una coma final:Solución:
ast
para resolver problemas de comillas simples y comas finalesPuede usar
ast
(parte de la biblioteca estándar para Python 2 y 3) para este procesamiento. Aquí hay un ejemplo :El uso
ast
evitará que tenga problemas de comillas simples y comas finales al interpretar JSON como el diccionario de Python (por lo que debe seguir la sintaxis del diccionario de Python). Es una alternativa deeval()
función bastante buena y segura para estructuras literales.La documentación de Python nos advirtió sobre el uso de cadenas grandes / complejas:
json.dumps con comillas simples
Para usar
json.dumps
con comillas simples fácilmente, puede usar este código:ast
documentaciónast Python 3 doc
ast Python 2 doc
Herramienta
Si edita JSON con frecuencia, puede usar CodeBeautify . Le ayuda a corregir el error de sintaxis y a minimizar / embellecer JSON.
Espero que ayude.
fuente
fuente
Todas las demás respuestas pueden responder a su consulta, pero enfrenté el mismo problema que se debió a un desvío
,
que agregué al final de mi cadena json de esta manera:Finalmente lo hice funcionar cuando eliminé extra
,
como este:¡Espero que esto ayude! salud.
fuente
usado ast, ejemplo
fuente
Un caso diferente en el que encontré esto fue cuando estaba usando
echo
para canalizar el JSON en mi script de Python y envolví descuidadamente la cadena JSON entre comillas dobles:Tenga en cuenta que la cadena JSON en sí tiene comillas y debería haberlo hecho:
Así las cosas, esto es lo que recibió el script en Python:
{thumbnailWidth: 640}
; las comillas dobles se eliminaron efectivamente.fuente