Estou tendo problemas para usar json.loads para converter em um objeto dict e não consigo descobrir o que estou fazendo de errado. O erro exato que recebo ao executar isso é
ValueError: Expecting property name: line 1 column 2 (char 1)
Aqui está o meu 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)
Tenho quase certeza de que o erro está ocorrendo da 2ª à última linha
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
mas não sei o que fazer para consertar. Qualquer conselho seria apreciado.
"
é que uma cópia colar de erro?print tweet.message.value
?ValueError
é enviado devido a um erro na entrada JSON, não é um problema em seu código. (Além da falta de"
quem normalmente deveria enviar um,SyntaxError
então presumo que seja apenas um erro de copiar e colar.)Respostas:
json.loads
irá carregar uma string json em um pythondict
,json.dumps
irá despejar um pythondict
em uma string json, por exemplo:Portanto, essa linha está incorreta, pois você está tentando
load
um pythondict
ejson.loads
está esperando um válidojson string
que deveria ter<type 'str'>
.Portanto, se você está tentando carregar o json, deve alterar o que está carregando para se parecer com o
json_string
acima, ou deve descartá-lo. Este é apenas meu melhor palpite com base nas informações fornecidas. O que você está tentando realizar?Além disso, você não precisa especificar o
u
antes de suas strings, como @Cld mencionou nos comentários.fonte
Encontrei outro problema que retorna o mesmo erro.
Problema de aspas simples
Usei uma string json com aspas simples :
Mas
json.loads
aceita apenas aspas duplas para propriedades json :Problema de vírgula final
json.loads
não aceita uma vírgula final:Solução:
ast
para resolver problemas de aspas simples e vírgula finalVocê pode usar
ast
(parte da biblioteca padrão para Python 2 e 3) para este processamento. Aqui está um exemplo :O uso
ast
impedirá você de problemas de aspas simples e vírgulas finais ao interpretar o dicionário JSON como o Python (portanto, você deve seguir a sintaxe do dicionário Python). É uma alternativa deeval()
função muito boa e segura para estruturas literais.A documentação do Python nos alertou sobre o uso de strings grandes / complexas:
json.dumps com aspas simples
Para usar
json.dumps
aspas simples facilmente, você pode usar este código:ast
documentaçãoast Python 3 doc
ast Python 2 doc
Ferramenta
Se você edita JSON com frequência, pode usar CodeBeautify . Isso ajuda a corrigir erros de sintaxe e reduzir / embelezar JSON.
Espero que ajude.
fonte
fonte
Todas as outras respostas podem responder à sua pergunta, mas eu enfrentei o mesmo problema devido ao extravio
,
que adicionei no final da minha string json desta forma:Eu finalmente consegui fazer funcionar quando removi itens extras
,
como este:Espero que esta ajuda! Felicidades.
fonte
usado ast, exemplo
fonte
Um caso diferente em que encontrei isso foi quando estava usando
echo
para canalizar o JSON em meu script Python e descuidadamente envolvi a string JSON entre aspas duplas:Observe que a própria string JSON tem aspas e eu deveria ter feito:
Do jeito que estava, isto é o que o script python recebeu
{thumbnailWidth: 640}
:; as aspas duplas foram efetivamente eliminadas.fonte