How to correctly read a JSON with multiple subleaves?

In Python3 this code reads the Senate API to create a dataframe, from the propositions of a year

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 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 starts after these keys: ["Searchbasicamateria"] ["Materias"] ["Materia"]

Then starts a group of four keys - "IdentificacaoMateria", "Datasbasicosmateria"," Autoresprincipales " and "SituacaoAtual" - and within them are the information of the columns I want to include in the dataframe, some information being in internal Sublevel

Each set of "material identifications", "Basic Material Data", "primary authors" and "current situation" is a proposition. And some items are not required, they just don't show up - so I did the test with None

The code worked and generated the dataframe, but some columns were completely blank, such as nickname, name, or parliamentary name. I'm checking the key paths to the information and seem correct

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

Author: Reinaldo Chaves, 2019-01-17

1 answers

The problem is in your test. You test

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

This way you are checking if ApelidoMateria is in item, when you should actually test:

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

This way you do the test if ApelidoMateria is in item['DadosBasicosMateria']. You should be aware of the level at which the searched object is in the JSON. Notice that ApelidoMateria is not really in item, but in item['DadosBasicosMateria'].

You must do the same procedure above on all searched objects by performing the test on the correct level.

 1
Author: Igor Cavalcanti, 2019-01-18 12:04:59