Eu tenho esse JSON em um arquivo:
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": [
"id": "valore"
],
"om_points": "value",
"parameters": [
"id": "valore"
]
}
Eu escrevi este script para imprimir todos os dados JSON:
import json
from pprint import pprint
with open('data.json') as f:
data = json.load(f)
pprint(data)
Este programa gera uma exceção, no entanto:
Traceback (most recent call last):
File "<pyshell#1>", line 5, in <module>
data = json.load(f)
File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 13 column 13 (char 213)
Como posso analisar o JSON e extrair seus valores?
Respostas:
Seus dados não são no formato JSON válido . Você tem
[]
quando deve ter{}
:[]
são para matrizes JSON, chamadaslist
em Python{}
são para objetos JSON, chamadosdict
em PythonVeja como seu arquivo JSON deve ficar:
Então você pode usar seu código:
Com os dados, agora você também pode encontrar valores da seguinte forma:
Experimente e veja se isso faz sentido.
fonte
u'
antes de cada chave. Alguma idéia do porquê?Você
data.json
deve ficar assim:Seu código deve ser:
Observe que isso funciona apenas no Python 2.6 e
with
versões posteriores , pois depende da declaração- . No uso do Python 2.5from __future__ import with_statement
, no Python <= 2.4, consulte a resposta de Justin Peel , na qual essa resposta se baseia.Agora você também pode acessar valores únicos como este:
fonte
data_file
open
ed mais do que o necessário.pprint
Awith
inserção no contexto-mantém adata_file
abertura por mais tempo.data["om_points"]
,data["masks"]["id"]
. A idéia é que você pode alcançar qualquer nível em um dicionário especificando os 'caminhos principais'. Se você receber umaKeyError
exceção, significa que a chave não existe no caminho. Procure erros de digitação ou verifique a estrutura do seu dicionário.A resposta de Justin Peel é realmente útil, mas se você estiver usando Python 3, a leitura JSON deve ser feita assim:
Nota: use em
json.loads
vez dejson.load
. No Python 3,json.loads
usa um parâmetro de string.json.load
usa um parâmetro de objeto semelhante a arquivo.data_file.read()
retorna um objeto string.Para ser sincero, não acho que seja um problema carregar todos os dados json na memória na maioria dos casos.
fonte
json.load
ser evitado em favor.loads
no Python 3?load
.fonte
json.loads
não decodifica vários objetos json. Caso contrário, você receberá o erro 'Dados extras'.}
,]
ou"
). Portanto, você pode concatenar vários objetos em uma única sequência ou arquivo único, sem ambiguidade. O problema aqui é que um analisador que espera um único objeto falha quando é passado mais de um objeto..jsonl
(linhas json), os objetos são separados por um caractere de nova linha que torna o pré-processamento para análise trivial e permite facilmente dividir / lote arquivos sem se preocupar com marcadores de início / fim."Ultra JSON" ou simplesmente "ujson" podem lidar com
[]
a entrada de arquivo JSON. Se você estiver lendo um arquivo de entrada JSON em seu programa como uma lista de elementos JSON; tais como,[{[{}]}, {}, [], etc...]
ujson pode lidar com qualquer ordem arbitrária de listas de dicionários, dicionários de listas.Você pode encontrar ujson no índice do pacote Python e a API é quase idêntica à
json
biblioteca interna do Python .O ujson também é muito mais rápido se você estiver carregando arquivos JSON maiores. Você pode ver os detalhes de desempenho em comparação com outras bibliotecas Python JSON no mesmo link fornecido.
fonte
Se você estiver usando o Python3, tente alterar seu
connection.json
JSON ( arquivo) para:Em seguida, usando o seguinte código:
fonte
with
declaração seria melhorAqui você vai com o
data.json
arquivo modificado :Você pode ligar ou imprimir dados no console usando as linhas abaixo:
Saída prevista para
print(data_item['parameters'][0]['id'])
:Saída prevista para
print(data_item['parameters'][0]['id'])
:fonte
Existem dois tipos nessa análise.
Em um arquivo, você pode usar o seguinte
Este artigo explica a análise completa e a obtenção de valores usando dois cenários. Analisando JSON usando Python
fonte
Como usuário python3 ,
A diferença entre
load
eloads
métodos é importante, especialmente quando você lê dados json do arquivo.Conforme declarado nos documentos:
json.load:
json.loads:
O método json.load pode ler diretamente o documento json aberto, pois é capaz de ler o arquivo binário.
Como resultado, seus dados json estão disponíveis como em um formato especificado de acordo com esta tabela de conversão:
https://docs.python.org/3.7/library/json.html#json-to-py-table
fonte