How to correctly read a multi-level JSON?

Asked

Viewed 240 times

0

In Python3 this code reads the Senate API to create a dataframe of one-year propositions

import requests
import pandas as pd

headers = {"Accept" : "application/json"}

proposals = []
url = 'http://legis.senado.leg.br/dadosabertos/materia/pesquisa/lista?ano=2010'

try:
    r = requests.get(url, headers=headers)
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc) 
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)  
except requests.exceptions.RequestException as err:
    print ("OOps: Something Else",err)

content = r.json()

for item in content["PesquisaBasicaMateria"]["Materias"]["Materia"]:
    dicionario = {"AnoMateria": str(item['IdentificacaoMateria']['AnoMateria']), 
                      "CodigoMateria": str(item['IdentificacaoMateria']['CodigoMateria']), 
                      "DescricaoIdentificacaoMateria": item['IdentificacaoMateria']['DescricaoIdentificacaoMateria'], 
                      "DescricaoObjetivoProcesso": item["DescricaoObjetivoProcesso"] if "DescricaoObjetivoProcesso" in item else None,
                      "DescricaoSubtipoMateria": item['IdentificacaoMateria']['DescricaoSubtipoMateria'], 
                      "IndicadorTramitando": item['IdentificacaoMateria']['IndicadorTramitando'], 
                      "NomeCasaIdentificacaoMateria": item['IdentificacaoMateria']['NomeCasaIdentificacaoMateria'], 
                      "NumeroMateria": str(item['IdentificacaoMateria']['NumeroMateria']), 
                      "ApelidoMateria": item['DadosBasicosMateria']['ApelidoMateria'] if 'ApelidoMateria' in item else None, 
                      "DataApresentacao": item['DadosBasicosMateria']['DataApresentacao'], 
                      "DataLeitura": item['DadosBasicosMateria']['DataLeitura'] if 'DataLeitura' in item else None,
                      "EmentaMateria": item['DadosBasicosMateria']['EmentaMateria'] if 'EmentaMateria' in item else None,
                      "ExplicacaoEmentaMateria": item['DadosBasicosMateria']['ExplicacaoEmentaMateria'] if 'ExplicacaoEmentaMateria' in item else None,
                      "IndicadorComplementar": item['DadosBasicosMateria']['IndicadorComplementar'] if 'IndicadorComplementar' in item else None,
                      "NaturezaMateria": item['DadosBasicosMateria']['NaturezaMateria'] if 'NaturezaMateria' in item else None,
                      "NomeAutor": item['AutoresPrincipais']['AutorPrincipal']['NomeAutor'] if 'NomeAutor' in item else None,
                      "SiglaTipoAutor": item['AutoresPrincipais']['AutorPrincipal']['SiglaTipoAutor'] if 'SiglaTipoAutor' in item else None,
                      "IndicadorOutrosAutores": item['AutoresPrincipais']['AutorPrincipal']['IndicadorOutrosAutores'] if 'IndicadorOutrosAutores' in item else None,
                      "CodigoParlamentar": str(item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['CodigoParlamentar']) if 'CodigoParlamentar' in item else None,
                      "NomeParlamentar": item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['NomeParlamentar'] if 'NomeParlamentar' in item else None,
                      "NomeCompletoParlamentar": item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['NomeCompletoParlamentar'] if 'NomeCompletoParlamentar' in item else None,
                      "UrlFotoParlamentar": item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['UrlFotoParlamentar'] if 'UrlFotoParlamentar' in item else None,
                      "UfParlamentar": item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['UfParlamentar'] if 'UfParlamentar' in item else None,
                      "DataSituacao": item['SituacaoAtual']['Autuacoes']['Autuacao']['Situacao']['DataSituacao'] if 'DataSituacao' in item else None,
                      "DescricaoSituacao": item['SituacaoAtual']['Autuacoes']['Autuacao']['Situacao']['DescricaoSituacao'] if 'DescricaoSituacao' in item else None
                      }
    proposals.append(dicionario)

df_projetos_api = pd.DataFrame(proposals)
df_projetos_api.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4216 entries, 0 to 4215
Data columns (total 25 columns):
AnoMateria                       4216 non-null object
ApelidoMateria                   0 non-null object
CodigoMateria                    4216 non-null object
CodigoParlamentar                0 non-null object
DataApresentacao                 4216 non-null object
DataLeitura                      0 non-null object
DataSituacao                     0 non-null object
DescricaoIdentificacaoMateria    4216 non-null object
DescricaoObjetivoProcesso        0 non-null object
DescricaoSituacao                0 non-null object
DescricaoSubtipoMateria          4216 non-null object
EmentaMateria                    0 non-null object
ExplicacaoEmentaMateria          0 non-null object
IndicadorComplementar            0 non-null object
IndicadorOutrosAutores           0 non-null object
IndicadorTramitando              4216 non-null object
NaturezaMateria                  0 non-null object
NomeAutor                        0 non-null object
NomeCasaIdentificacaoMateria     4216 non-null object
NomeCompletoParlamentar          0 non-null object
NomeParlamentar                  0 non-null object
NumeroMateria                    4216 non-null object
SiglaTipoAutor                   0 non-null object
UfParlamentar                    0 non-null object
UrlFotoParlamentar               0 non-null object
dtypes: object(25)
memory usage: 411.8+ KB

Here is an excerpt from the extracted JSON:

{'PesquisaBasicaMateria': {'@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
  '@xsi:noNamespaceSchemaLocation': 'http://legis.senado.gov.br/dadosabertos/dados/PesquisaBasicaMateriav5.xsd',
  'Metadados': {'Versao': '16/01/2019 18:31:16',
   'VersaoServico': '5',
   'DataVersaoServico': '2017-02-01',
   'DescricaoDataSet': 'Efetua a pesquisa de matérias, com a criação de um filtro através dos parâmetros que podem ser informados.\n      Se não informar parâmetro algum, não retorna conteúdo.'},
  'Materias': {'Materia': [{'IdentificacaoMateria': {'CodigoMateria': '114035',
      'SiglaCasaIdentificacaoMateria': 'SF',
      'NomeCasaIdentificacaoMateria': 'Senado Federal',
      'SiglaSubtipoMateria': 'ATS',
      'DescricaoSubtipoMateria': 'ATO DO PRESIDENTE DO SENADO FEDERAL',
      'NumeroMateria': '00192',
      'AnoMateria': '2010',
      'DescricaoIdentificacaoMateria': 'ATS 192/2010',
      'IndicadorTramitando': 'Não'},
     'DadosBasicosMateria': {'EmentaMateria': 'Institui Comissão de Juristas responsável pela elaboração de anteprojeto de Código Eleitoral.',
      'IndicadorComplementar': 'Não',
      'DataApresentacao': '2010-06-08',
      'SiglaCasaLeitura': 'SF',
      'NomeCasaLeitura': 'Senado Federal'},
     'AutoresPrincipais': {'AutorPrincipal': {'SiglaTipoAutor': 'PRESIDENTE_SF',
       'IndicadorOutrosAutores': 'Não'}},
     'SituacaoAtual': {'Autuacoes': {'Autuacao': {'NumeroAutuacao': '1',
        'Situacao': {'DataSituacao': '2018-12-21',
         'CodigoSituacao': '32',
         'SiglaSituacao': 'COMEXT',
         'DescricaoSituacao': 'COMISSÃO TEMPORÁRIA EXTINTA'},
        'Local': {'DataLocal': '2018-12-21',
         'CodigoLocal': '1998',
         'SiglaCasaLocal': 'SF',
         'NomeCasaLocal': 'Senado Federal',
         'SiglaLocal': 'PLEN',
         'NomeLocal': 'Plenário do Senado Federal'}}}}},
    {'IdentificacaoMateria': {'CodigoMateria': '98952',
      'SiglaCasaIdentificacaoMateria': 'CN',
      'NomeCasaIdentificacaoMateria': 'Congresso Nacional',
      'SiglaSubtipoMateria': 'AVN',
      'DescricaoSubtipoMateria': 'AVISO (CN)',
      'NumeroMateria': '00001',
      'AnoMateria': '2011',
      'DescricaoIdentificacaoMateria': 'AVN 1/2011',
      'IndicadorTramitando': 'Não'},
     'DadosBasicosMateria': {'EmentaMateria': 'Encaminha ao Congresso Nacional o Relatório de Desempenho do Fundo Soberano do Brasil - FSB, relativo ao terceiro trimestre de 2010.',
      'IndicadorComplementar': 'Não',
      'DataApresentacao': '2011-01-26',
      'DataLeitura': '2011-01-26',
      'SiglaCasaLeitura': 'CN',
      'NomeCasaLeitura': 'Congresso Nacional',
      'NaturezaMateria': {'CodigoNatureza': '1062',
       'NomeNatureza': 'RELATORIO_DESEMPENHO_FSB',
       'DescricaoNatureza': 'Relatório de Desempenho do Fundo Soberano do Brasil'}},
     'AutoresPrincipais': {'AutorPrincipal': {'NomeAutor': 'Ministério da Fazenda',
       'SiglaTipoAutor': 'COMISSAO_CONGRESSO',
       'IndicadorOutrosAutores': 'Não'}},
     'SituacaoAtual': {'Autuacoes': {'Autuacao': {'NumeroAutuacao': '1',
        'Situacao': {'DataSituacao': '2013-11-29',
         'CodigoSituacao': '107',
         'SiglaSituacao': 'CONHECIDA',
         'DescricaoSituacao': 'CONHECIDA.'},
        'Local': {'DataLocal': '2013-12-19',
         'CodigoLocal': '354',
         'SiglaCasaLocal': 'SF',
         'NomeCasaLocal': 'Senado Federal',
         'SiglaLocal': 'SARQ',
         'NomeLocal': 'Secretaria de Arquivo'}}}}},
    {'IdentificacaoMateria': {'CodigoMateria': '95410',
      'SiglaCasaIdentificacaoMateria': 'CN',
      'NomeCasaIdentificacaoMateria': 'Congresso Nacional',
      'SiglaSubtipoMateria': 'AVN',
      'DescricaoSubtipoMateria': 'AVISO (CN)',
      'NumeroMateria': '00001',
      'AnoMateria': '2010',
      'DescricaoIdentificacaoMateria': 'AVN 1/2010',
      'IndicadorTramitando': 'Não'},
     'DadosBasicosMateria': {'EmentaMateria': 'Encaminha ao Congresso Nacional o Relatório de Desempenho do Fundo Soberano do Brasil, relativo ao terceiro trimestre de 2009.',
      'IndicadorComplementar': 'Não',
      'DataApresentacao': '2010-02-01',
      'DataLeitura': '2010-02-01',
      'SiglaCasaLeitura': 'CN',
      'NomeCasaLeitura': 'Congresso Nacional',
      'NaturezaMateria': {'CodigoNatureza': '1062',
       'NomeNatureza': 'RELATORIO_DESEMPENHO_FSB',
       'DescricaoNatureza': 'Relatório de Desempenho do Fundo Soberano do Brasil'}},
     'AutoresPrincipais': {'AutorPrincipal': {'NomeAutor': 'Ministério da Fazenda',
       'SiglaTipoAutor': 'COMISSAO_CONGRESSO',
       'IndicadorOutrosAutores': 'Não'}},
     'SituacaoAtual': {'Autuacoes': {'Autuacao': {'NumeroAutuacao': '1',
        'Situacao': {'DataSituacao': '2013-11-29',
         'CodigoSituacao': '107',
         'SiglaSituacao': 'CONHECIDA',
         'DescricaoSituacao': 'CONHECIDA.'},
        'Local': {'DataLocal': '2013-12-19',
         'CodigoLocal': '354',
         'SiglaCasaLocal': 'SF',
         'NomeCasaLocal': 'Senado Federal',
         'SiglaLocal': 'SARQ',
         'NomeLocal': 'Secretaria de Arquivo'}}}}},
    {'IdentificacaoMateria': {'CodigoMateria': '95411',
      'SiglaCasaIdentificacaoMateria': 'CN',
      'NomeCasaIdentificacaoMateria': 'Congresso Nacional',
      'SiglaSubtipoMateria': 'AVN',
      'DescricaoSubtipoMateria': 'AVISO (CN)',
      'NumeroMateria': '00002',
      'AnoMateria': '2010',
      'DescricaoIdentificacaoMateria': 'AVN 2/2010',
      'IndicadorTramitando': 'Não'},
     'DadosBasicosMateria': {'EmentaMateria': 'Encaminha ao Congresso Nacional Relatório sobre as operações de redesconto e empréstimo realizadas nos termos da Lei 11.882, de 23 de dezembro de 2008.',
      'IndicadorComplementar': 'Não',
      'DataApresentacao': '2010-02-01',
      'DataLeitura': '2010-02-01',
      'SiglaCasaLeitura': 'SF',
      'NomeCasaLeitura': 'Senado Federal',
      'NaturezaMateria': {'CodigoNatureza': '285',
       'NomeNatureza': 'RELATORIO_RECOMEND_DOCUMENT',
       'DescricaoNatureza': 'Relatório, recomendação, documentação'},
      'ResultadoMateria': 'Situação: Incluída em pauta, no âmbito da CMO.'},
     'AutoresPrincipais': {'AutorPrincipal': {'NomeAutor': 'Banco Central do Brasil',
       'SiglaTipoAutor': 'COMISSAO_CONGRESSO',
       'IndicadorOutrosAutores': 'Não'}},
     'SituacaoAtual': {'Autuacoes': {'Autuacao': {'NumeroAutuacao': '1',
        'Situacao': {'DataSituacao': '2015-08-04',
         'CodigoSituacao': '107',
         'SiglaSituacao': 'CONHECIDA',
         'DescricaoSituacao': 'CONHECIDA.'},
        'Local': {'DataLocal': '2015-08-12',
         'CodigoLocal': '354',
         'SiglaCasaLocal': 'SF',
         'NomeCasaLocal': 'Senado Federal',
         'SiglaLocal': 'SARQ',
         'NomeLocal': 'Secretaria de Arquivo'}}}}},

...

The information begins after these keys: ["Pesquisa basicamateria"]["Materias"]["Materia"]

There starts a group of four keys - "Identificacaomateria", "Dadosbasicosmateria", "Autoresprincipais" and "Situacaoatual" - and within them are the column information I want to include in the dataframe, and some information is in internal sublevels

Each set of "Identificacaomateria", "Dadosbasicosmateria", "Autoresprincipais" and "Situacaoatual" is a proposition. And some items are not required, just do not appear - so I tested with None

The code worked and generated the dataframe, but some columns were totally blank, such as Apelidomateria, Nominautor or Nomeparlamentar. I’m checking the key paths to the information and it looks right

Please does anyone know what the problem is? Or if there is a better way to do?

1 answer

1


The problem is in your test. You test

item['DadosBasicosMateria']['ApelidoMateria'] if 'ApelidoMateria' in item else None

This way you are checking whether ApelidoMateria this in item, when you really should test:

item['DadosBasicosMateria']['ApelidoMateria'] if 'ApelidoMateria' in item['DadosBasicosMateria'] else None

That way you take the test if ApelidoMateria is in item['DadosBasicosMateria']. You should be aware of the level at which the searched object is in JSON. Note that ApelidoMateria REALLY ISN’T IN item, but in item['DadosBasicosMateria'].

You must do the same procedure above on all objects sought, performing the test at the correct level.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.