Código Python para carregar dados de algum arquivo JSON longo e complicado:
with open(filename, "r") as f:
data = json.loads(f.read())
(nota: a melhor versão do código deve ser:
with open(filename, "r") as f:
data = json.load(f)
mas ambos exibem comportamento semelhante)
Para muitos tipos de erro JSON (delimitadores ausentes, barras invertidas incorretas em cadeias, etc.), isso imprime uma boa mensagem útil contendo o número da linha e da coluna onde o erro JSON foi encontrado.
No entanto, para outros tipos de erro JSON (incluindo o clássico "usando vírgula no último item de uma lista", mas também outras coisas como capitalizar verdadeiro / falso), a saída do Python é apenas:
Traceback (most recent call last):
File "myfile.py", line 8, in myfunction
config = json.loads(f.read())
File "c:\python27\lib\json\__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "c:\python27\lib\json\decoder.py", line 360, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\python27\lib\json\decoder.py", line 378, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Para esse tipo de ValueError, como você faz com que o Python diga onde está o erro no arquivo JSON?
json.load(f)
vez dejson.loads(f.read())
Respostas:
Descobri que o
simplejson
módulo fornece erros mais descritivos em muitos casos em que ojson
módulo interno é vago. Por exemplo, no caso de uma vírgula após o último item de uma lista:o que não é muito descritivo. A mesma operação com
simplejson
:Muito melhor! O mesmo acontece com outros erros comuns, como capitalização
True
.fonte
json
biblioteca stdlib foi atualizada e fornece o novo formato de mensagem de erro. No entanto, não tenho tempo para acompanhar lançamentos exatos agora.Você não será capaz de obter python para dizer onde o JSON está incorreto. Você precisará usar um linter online em algum lugar como este
Isso mostrará um erro no JSON que você está tentando decodificar.
fonte
Você pode experimentar a biblioteca rson encontrada aqui: http://code.google.com/p/rson/ . Também no PYPI: https://pypi.python.org/pypi/rson/0.9, para que você possa usar easy_install ou pip para obtê-lo.
para o exemplo dado por tom:
O RSON foi projetado para ser um superconjunto de JSON, para que ele possa analisar arquivos JSON. Ele também tem uma sintaxe alternativa que é muito mais agradável para os humanos olharem e editarem. Eu o uso bastante para arquivos de entrada.
Quanto à capitalização de valores booleanos: parece que o rson lê booleanos incorretamente capitalizados como seqüências de caracteres.
fonte
Eu tive um problema semelhante e foi devido a aspas simples. O padrão JSON ( http://json.org ) fala apenas sobre o uso de aspas duplas, portanto, a
json
biblioteca python suporta apenas aspas duplas.fonte
Para a minha versão específica desse problema, fui em frente e procurei a declaração da função
load_json_file(path)
dentro dopackaging.py
arquivo e depois contrabandeei umaprint
linha para ele:Dessa maneira, imprimia o conteúdo do arquivo json antes de entrar no try-catch, e dessa maneira - mesmo com meu conhecimento em Python quase inexistente - eu era capaz de descobrir rapidamente por que minha configuração não conseguia ler o arquivo json.
(Foi porque eu havia configurado meu editor de texto para escrever uma lista técnica UTF-8 ... estúpida)
Apenas mencionei isso porque, embora talvez não seja uma boa resposta para o problema específico do OP, esse foi um método bastante rápido para determinar a origem de um bug muito opressivo. E aposto que muitas pessoas tropeçarão neste artigo que estão procurando uma solução mais detalhada para a
MalformedJsonFileError: No JSON object could be decoded when reading …
. Então isso pode ajudá-los.fonte
with open(fn) as f
), ele trata de fechar o arquivo em uma exceção para você. pt.wikibooks.org/wiki/Python_Programming/…Quanto a mim, meu arquivo json é muito grande, quando usado
json
em python, recebe o erro acima.Após a instalação
simplejson
porsudo pip install simplejson
.E então eu resolvi.
fonte
Eu tive um problema semelhante, este foi o meu código:
o problema era que eu tinha esquecido,
file.close()
resolvi o problema.fonte
with open(fn) as f
), ele trata de fechar o arquivo em uma exceção para você. pt.wikibooks.org/wiki/Python_Programming/…A resposta aceita é a mais fácil de resolver o problema. Mas, caso você não tenha permissão para instalar o simplejson devido à política da sua empresa, proponho a solução abaixo para corrigir o problema específico de "usar vírgula no último item de uma lista" :
Crie uma classe filho "JSONLintCheck" para herdar da classe "JSONDecoder" e substitua o método init da classe "JSONDecoder" como abaixo:
fonte
Apenas acertei o mesmo problema e, no meu caso, o problema estava relacionado a
BOM
(marca de ordem de bytes) no início do arquivo.json.tool
se recusaria a processar até mesmo o arquivo vazio (apenas chaves) até eu remover a marca UTF BOM.O que eu fiz é:
set nobomb
)Isso resolveu o problema com o json.tool. Espero que isto ajude!
fonte
Quando seu arquivo é criado. Em vez de criar um arquivo com conteúdo está vazio. Substituir com:
fonte
Você pode usar o cjson , que afirma ser até 250 vezes mais rápido que as implementações de python puro, já que você tem "algum arquivo JSON longo e complicado" e provavelmente precisará executá-lo várias vezes (os decodificadores falham e relatam o primeiro erro que eles apenas encontro).
fonte