Tenho tentado descobrir uma boa maneira de carregar objetos JSON em Python. Eu envio estes dados json:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
para o back-end, onde será recebido como uma string que usei json.loads(data)
para analisá-lo.
Mas cada vez eu recebia a mesma exceção:
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Pesquisei no Google, mas nada parece funcionar além desta solução json.loads(json.dumps(data))
que pessoalmente me parece não muito eficiente já que aceita qualquer tipo de dados mesmo os que não estejam no formato json.
Qualquer sugestão será muito apreciado.
json.dumps()
vez de apenas escrever python e esperar que a notação python funcione em seu leitor de JavaScript.print(jsonpickle_deserialized_object_string)
e tentei usar. Por algum motivo,print()
muda as cotações de"
para'
Respostas:
Este:
não é JSON.
Este:
é JSON.
EDIT:
Alguns comentaristas sugeriram que o acima não é suficiente.
Especificação JSON - RFC7159 afirma que uma string começa e termina com aspas. Isso é
"
.O quoute único
'
não tem significado semântico em JSON e é permitido apenas dentro de uma string.fonte
como JSON permite apenas strings entre aspas duplas, você pode manipular a string assim:
Isso substituirá todas as ocorrências de aspas simples por aspas duplas na string JSON
str
.Você também pode usar o
js-beautify
que é menos estrito:fonte
No meu caso, as aspas duplas não foram um problema.
A última vírgula me deu a mesma mensagem de erro.
Para remover essa vírgula, escrevi um código simples.
E isso funcionou para mim.
fonte
echo '{"json":"obj",}' | python -m json.tool
quando executado no shell, fornece "Esperando nome da propriedade entre aspas duplas: linha 1 coluna 15 (caractere 14)". Vírgulas à direita não são JSON legais, mas seria bom se o módulo JSON do Python emitisse uma mensagem de erro relevante neste caso.Simplesmente, essa string não é um JSON válido. Como diz o erro, os documentos JSON precisam usar aspas duplas.
Você precisa corrigir a fonte dos dados.
fonte
Eu verifiquei seus dados JSON
em http://jsonlint.com/ e os resultados foram:
modificá-lo para a seguinte string resolve o erro JSON:
fonte
As strings JSON devem usar aspas duplas. A biblioteca JSON python impõe isso para que você não consiga carregar sua string. Seus dados precisam ser assim:
Se isso não for algo que você pode fazer, você pode usar em
ast.literal_eval()
vez dejson.loads()
fonte
json.loads()
ast.literal_eval
resultará emValueError: malformed string
se a string JSON tiver um valor booleano.Isto resolverá o problema.
fonte
Como diz claramente um erro, os nomes devem ser colocados entre aspas duplas em vez de aspas simples. A string que você passa simplesmente não é um JSON válido. Deve ser parecido com
fonte
Usei esse método e consegui obter a saída desejada. meu script
resultado
fonte
Isso funcionou perfeitamente bem para mim. Obrigado.
fonte
Embora esta seja a solução correta, pode levar a uma grande dor de cabeça se houver um JSON como este -
Reparou no valor "Verdadeiro" ? Use isto para fazer com que as coisas sejam verificadas novamente para Booleanos. Isso cobrirá esses casos -
Além disso, certifique-se de não fazer
Tem que ser outra variável.
fonte
Eu tive um problema semelhante. Dois componentes que se comunicavam entre si estavam usando uma fila.
O primeiro componente não estava executando json.dumps antes de colocar a mensagem na fila. Portanto, a string JSON gerada pelo componente de recebimento estava entre aspas simples. Isso estava causando um erro
Adicionar json.dumps começou a criar JSON formatado corretamente e problema resolvido.
fonte
Use o
eval
função.Ele cuida da discrepância entre aspas simples e duplas.
fonte
Como as outras respostas explicam bem, o erro ocorre por causa de caracteres de aspas inválidos passados para o módulo json.
No meu caso, continuei a obter ValueError mesmo depois de substituir
'
por"
em minha string. O que finalmente percebi foi que alguns símbolos Unicode parecidos com aspas encontraram seu caminho na minha string:Para limpar tudo isso, você pode simplesmente passar sua string por meio de uma expressão regular:
fonte
Já tive esse problema várias vezes quando o JSON foi editado manualmente. Se alguém deletar algo do arquivo sem perceber, pode ocorrer o mesmo erro.
Por exemplo, se seu último "}" JSON estiver faltando, ele gerará o mesmo erro.
Portanto, se você editar seu arquivo manualmente, certifique-se de formatá-lo como esperado pelo decodificador JSON, caso contrário, você terá o mesmo problema.
Espero que isto ajude!
fonte
É sempre ideal usar o
json.dumps()
método. Para me livrar desse erro, usei o seguinte códigofonte