Search code examples
jsonjolt

Refactoring JOLT code to get expected output AGAIN


I have this input JSON:

[
  {
    "id": "08201",
    "nome": "Região Metropolitana de Piracicaba",
    "UF": {
      "id": 35,
      "sigla": "SP",
      "nome": "São Paulo",
      "regiao": {
        "id": 3,
        "sigla": "SE",
        "nome": "Sudeste"
      }
    },
    "sub-regioes-metropolitanas": [],
    "municipios": [
      {
        "id": 3500600,
        "nome": "Águas de São Pedro"
      },
      {
        "id": 3502002,
        "nome": "Analândia"
      },
      {
        "id": 3503307,
        "nome": "Araras"
      },
      {
        "id": 3510401,
        "nome": "Capivari"
      },
      {
        "id": 3511706,
        "nome": "Charqueada"
      },
      {
        "id": 3512209,
        "nome": "Conchal"
      },
      {
        "id": 3512407,
        "nome": "Cordeirópolis"
      },
      {
        "id": 3512704,
        "nome": "Corumbataí"
      },
      {
        "id": 3514908,
        "nome": "Elias Fausto"
      },
      {
        "id": 3521101,
        "nome": "Ipeúna"
      },
      {
        "id": 3521408,
        "nome": "Iracemápolis"
      },
      {
        "id": 3526704,
        "nome": "Leme"
      },
      {
        "id": 3526902,
        "nome": "Limeira"
      },
      {
        "id": 3530904,
        "nome": "Mombuca"
      },
      {
        "id": 3538709,
        "nome": "Piracicaba"
      },
      {
        "id": 3539301,
        "nome": "Pirassununga"
      },
      {
        "id": 3542107,
        "nome": "Rafard"
      },
      {
        "id": 3543907,
        "nome": "Rio Claro"
      },
      {
        "id": 3544004,
        "nome": "Rio das Pedras"
      },
      {
        "id": 3545159,
        "nome": "Saltinho"
      },
      {
        "id": 3546207,
        "nome": "Santa Cruz da Conceição"
      },
      {
        "id": 3546702,
        "nome": "Santa Gertrudes"
      },
      {
        "id": 3547007,
        "nome": "Santa Maria da Serra"
      },
      {
        "id": 3550407,
        "nome": "São Pedro"
      }
    ]
  },
  {
    "id": "05301",
    "nome": "Região Metropolitana de Sorocaba",
    "UF": {
      "id": 35,
      "sigla": "SP",
      "nome": "São Paulo",
      "regiao": {
        "id": 3,
        "sigla": "SE",
        "nome": "Sudeste"
      }
    },
    "sub-regioes-metropolitanas": [
      {
        "id": "0530101",
        "nome": "Sub-região 1",
        "municipios": [
          {
            "id": 3500758,
            "nome": "Alambari"
          },
          {
            "id": 3507001,
            "nome": "Boituva"
          },
          {
            "id": 3510302,
            "nome": "Capela do Alto"
          },
          {
            "id": 3511508,
            "nome": "Cerquilho"
          },
          {
            "id": 3511607,
            "nome": "Cesário Lange"
          },
          {
            "id": 3522307,
            "nome": "Itapetininga"
          },
          {
            "id": 3525854,
            "nome": "Jumirim"
          },
          {
            "id": 3551108,
            "nome": "Sarapuí"
          },
          {
            "id": 3554003,
            "nome": "Tatuí"
          },
          {
            "id": 3554508,
            "nome": "Tietê"
          }
        ]
      },
      {
        "id": "0530102",
        "nome": "Sub-região 2",
        "municipios": [
          {
            "id": 3501152,
            "nome": "Alumínio"
          },
          {
            "id": 3502754,
            "nome": "Araçariguama"
          },
          {
            "id": 3519709,
            "nome": "Ibiúna"
          },
          {
            "id": 3523909,
            "nome": "Itu"
          },
          {
            "id": 3528403,
            "nome": "Mairinque"
          },
          {
            "id": 3540606,
            "nome": "Porto Feliz"
          },
          {
            "id": 3545209,
            "nome": "Salto"
          },
          {
            "id": 3550605,
            "nome": "São Roque"
          }
        ]
      },
      {
        "id": "0530103",
        "nome": "Sub-região 3",
        "municipios": [
          {
            "id": 3502903,
            "nome": "Araçoiaba da Serra"
          },
          {
            "id": 3521002,
            "nome": "Iperó"
          },
          {
            "id": 3537800,
            "nome": "Piedade"
          },
          {
            "id": 3537909,
            "nome": "Pilar do Sul"
          },
          {
            "id": 3545308,
            "nome": "Salto de Pirapora"
          },
          {
            "id": 3550209,
            "nome": "São Miguel Arcanjo"
          },
          {
            "id": 3552205,
            "nome": "Sorocaba"
          },
          {
            "id": 3553500,
            "nome": "Tapiraí"
          },
          {
            "id": 3557006,
            "nome": "Votorantim"
          }
        ]
      }
    ],
    "municipios": [
      {
        "id": 3500758,
        "nome": "Alambari"
      },
      {
        "id": 3501152,
        "nome": "Alumínio"
      },
      {
        "id": 3502754,
        "nome": "Araçariguama"
      },
      {
        "id": 3502903,
        "nome": "Araçoiaba da Serra"
      },
      {
        "id": 3507001,
        "nome": "Boituva"
      },
      {
        "id": 3510302,
        "nome": "Capela do Alto"
      },
      {
        "id": 3511508,
        "nome": "Cerquilho"
      },
      {
        "id": 3511607,
        "nome": "Cesário Lange"
      },
      {
        "id": 3519709,
        "nome": "Ibiúna"
      },
      {
        "id": 3521002,
        "nome": "Iperó"
      },
      {
        "id": 3522307,
        "nome": "Itapetininga"
      },
      {
        "id": 3523909,
        "nome": "Itu"
      },
      {
        "id": 3525854,
        "nome": "Jumirim"
      },
      {
        "id": 3528403,
        "nome": "Mairinque"
      },
      {
        "id": 3537800,
        "nome": "Piedade"
      },
      {
        "id": 3537909,
        "nome": "Pilar do Sul"
      },
      {
        "id": 3540606,
        "nome": "Porto Feliz"
      },
      {
        "id": 3545209,
        "nome": "Salto"
      },
      {
        "id": 3545308,
        "nome": "Salto de Pirapora"
      },
      {
        "id": 3550209,
        "nome": "São Miguel Arcanjo"
      },
      {
        "id": 3550605,
        "nome": "São Roque"
      },
      {
        "id": 3551108,
        "nome": "Sarapuí"
      },
      {
        "id": 3552205,
        "nome": "Sorocaba"
      },
      {
        "id": 3553500,
        "nome": "Tapiraí"
      },
      {
        "id": 3554003,
        "nome": "Tatuí"
      },
      {
        "id": 3554508,
        "nome": "Tietê"
      },
      {
        "id": 3557006,
        "nome": "Votorantim"
      }
    ]
  },
  {
    "id": "05401",
    "nome": "Região Metropolitana de Ribeirão Preto",
    "UF": {
      "id": 35,
      "sigla": "SP",
      "nome": "São Paulo",
      "regiao": {
        "id": 3,
        "sigla": "SE",
        "nome": "Sudeste"
      }
    },
    "sub-regioes-metropolitanas": [
      {
        "id": "0540104",
        "nome": "Sub-região 4",
        "municipios": [
          {
            "id": 3501004,
            "nome": "Altinópolis"
          },
          {
            "id": 3505906,
            "nome": "Batatais"
          },
          {
            "id": 3531902,
            "nome": "Morro Agudo"
          },
          {
            "id": 3533601,
            "nome": "Nuporanga"
          },
          {
            "id": 3534302,
            "nome": "Orlândia"
          },
          {
            "id": 3544905,
            "nome": "Sales Oliveira"
          },
          {
            "id": 3547908,
            "nome": "Santo Antônio da Alegria"
          }
        ]
      },
      {
        "id": "0540101",
        "nome": "Sub-região 1",
        "municipios": [
          {
            "id": 3505609,
            "nome": "Barrinha"
          },
          {
            "id": 3507803,
            "nome": "Brodowski"
          },
          {
            "id": 3513108,
            "nome": "Cravinhos"
          },
          {
            "id": 3514601,
            "nome": "Dumont"
          },
          {
            "id": 3518859,
            "nome": "Guatapará"
          },
          {
            "id": 3525102,
            "nome": "Jardinópolis"
          },
          {
            "id": 3527603,
            "nome": "Luís Antônio"
          },
          {
            "id": 3540200,
            "nome": "Pontal"
          },
          {
            "id": 3540903,
            "nome": "Pradópolis"
          },
          {
            "id": 3543402,
            "nome": "Ribeirão Preto"
          },
          {
            "id": 3547502,
            "nome": "Santa Rita do Passa Quatro"
          },
          {
            "id": 3550902,
            "nome": "São Simão"
          },
          {
            "id": 3551405,
            "nome": "Serra Azul"
          },
          {
            "id": 3551504,
            "nome": "Serrana"
          },
          {
            "id": 3551702,
            "nome": "Sertãozinho"
          }
        ]
      },
      {
        "id": "0540103",
        "nome": "Sub-região 3",
        "municipios": [
          {
            "id": 3509403,
            "nome": "Cajuru"
          },
          {
            "id": 3510906,
            "nome": "Cássia dos Coqueiros"
          },
          {
            "id": 3530508,
            "nome": "Mococa"
          },
          {
            "id": 3546256,
            "nome": "Santa Cruz da Esperança"
          },
          {
            "id": 3547601,
            "nome": "Santa Rosa de Viterbo"
          },
          {
            "id": 3553302,
            "nome": "Tambaú"
          }
        ]
      },
      {
        "id": "0540102",
        "nome": "Sub-região 2",
        "municipios": [
          {
            "id": 3518602,
            "nome": "Guariba"
          },
          {
            "id": 3524303,
            "nome": "Jaboticabal"
          },
          {
            "id": 3531308,
            "nome": "Monte Alto"
          },
          {
            "id": 3539509,
            "nome": "Pitangueiras"
          },
          {
            "id": 3553203,
            "nome": "Taiúva"
          },
          {
            "id": 3553658,
            "nome": "Taquaral"
          }
        ]
      }
    ],
    "municipios": [
      {
        "id": 3501004,
        "nome": "Altinópolis"
      },
      {
        "id": 3505609,
        "nome": "Barrinha"
      },
      {
        "id": 3505906,
        "nome": "Batatais"
      },
      {
        "id": 3507803,
        "nome": "Brodowski"
      },
      {
        "id": 3509403,
        "nome": "Cajuru"
      },
      {
        "id": 3510906,
        "nome": "Cássia dos Coqueiros"
      },
      {
        "id": 3513108,
        "nome": "Cravinhos"
      },
      {
        "id": 3514601,
        "nome": "Dumont"
      },
      {
        "id": 3518602,
        "nome": "Guariba"
      },
      {
        "id": 3518859,
        "nome": "Guatapará"
      },
      {
        "id": 3524303,
        "nome": "Jaboticabal"
      },
      {
        "id": 3525102,
        "nome": "Jardinópolis"
      },
      {
        "id": 3527603,
        "nome": "Luís Antônio"
      },
      {
        "id": 3530508,
        "nome": "Mococa"
      },
      {
        "id": 3531308,
        "nome": "Monte Alto"
      },
      {
        "id": 3531902,
        "nome": "Morro Agudo"
      },
      {
        "id": 3533601,
        "nome": "Nuporanga"
      },
      {
        "id": 3534302,
        "nome": "Orlândia"
      },
      {
        "id": 3539509,
        "nome": "Pitangueiras"
      },
      {
        "id": 3540200,
        "nome": "Pontal"
      },
      {
        "id": 3540903,
        "nome": "Pradópolis"
      },
      {
        "id": 3543402,
        "nome": "Ribeirão Preto"
      },
      {
        "id": 3544905,
        "nome": "Sales Oliveira"
      },
      {
        "id": 3546256,
        "nome": "Santa Cruz da Esperança"
      },
      {
        "id": 3547502,
        "nome": "Santa Rita do Passa Quatro"
      },
      {
        "id": 3547601,
        "nome": "Santa Rosa de Viterbo"
      },
      {
        "id": 3547908,
        "nome": "Santo Antônio da Alegria"
      },
      {
        "id": 3550902,
        "nome": "São Simão"
      },
      {
        "id": 3551405,
        "nome": "Serra Azul"
      },
      {
        "id": 3551504,
        "nome": "Serrana"
      },
      {
        "id": 3551702,
        "nome": "Sertãozinho"
      },
      {
        "id": 3553203,
        "nome": "Taiúva"
      },
      {
        "id": 3553302,
        "nome": "Tambaú"
      },
      {
        "id": 3553658,
        "nome": "Taquaral"
      }
    ]
  }
]

I need this output (example):

[ [ {
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3500758,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3507001,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3510302,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3511508,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3511607,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3522307,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3525854,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3551108,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3554003,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05301",
  "nome_rgia_mptn" : "Região Metropolitana de Sorocaba",
  "id_sub_rgia_mptn" : "0530101",
  "nome_sub_rgia_mptn" : "Sub-região 1",
  "id_mcpo" : 3554508,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05101",
  "nome_rgia_mptn" : "Região Metropolitana de Campinas",
  "id_sub_rgia_mptn" : "",
  "nome_sub_rgia_mptn" : "",
  "id_mcpo" : 3501608,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
},
{
  "id_rgia_mptn" : "05101",
  "nome_rgia_mptn" : "Região Metropolitana de Campinas",
  "id_sub_rgia_mptn" : "",
  "nome_sub_rgia_mptn" : "",
  "id_mcpo" : 3503802,
  "id_uf" : 35,
  "sgla_uf" : "SP",
  "id_rgia" : 3,
  "sgla_rgia" : "SE"
}]]

I want it according to these notes:

    • "id" of each object belonging to the root list
    • "name" of each object belonging to the root list
    • "id" of each object belonging to the list of "sub-regioes-metropolitanas"
    • "name" of each object belonging to the list of "sub-regioes-metropolitanas"
    • "id" of each municipality belonging to the list of "municipios" belonging to the list of "sub-regioes-metropolitanas" –

Like that:

  1. root.id -> id_rgia_mptn
  2. root.nome -> nome_rgia_mptn
  3. root.sub-regioes-metropolitanas.id -> id_sub_rgia_mptn
  4. root.sub-regioes-metropolitanas.nome -> nome_sub_rgia_mptn
  5. root.sub-regioes-metropolitanas.municipios.id -> id_mcpo

The results for each attribute cannot bring LISTS of values, for example: id_mcpo : [1, 2, 3, 4, 5, 6], I need one value to be brought per line, like this:

, 1. id_mcpo: 1,
, 2. id_mcpo: 2,
, 3. id_mcpo: 3,
, 4. id_mcpo: 4,
, 5. id_mcpo: 5,
, 6. id_mcpo: 6,

Since I will save this in tables.

In my other question, the answer ended up considering "municipios" outside "sub-regioes-metropolitanas" and I want what is INSIDE "sub-regioes-metropolitanas".

I know that some "sub-regioes-metropolitanas" do not have "municipios", but there is no problem with these fields being empty or simply not being available in these cases.

Can you help me do a JOLT to get the expected result?

I tried with this JOLT and I didn't get the expected output:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "id": "[&1].id_rgia_mptn",
        "nome": "[&1].nome_rgia_mptn",
        "sub-regioes-metropolitanas": {
          "*": {
            "id": "[&1].id_sub_rgia_mptn",
            "nome": "[&1].nome_sub_rgia_mptn",
            "municipios": {
              "*": {
                "id": "[&3].id_mcpo"
              }
            }
          }
        },
        "UF": {
          "id": "[&2].id_uf",
          "sigla": "[&2].sgla_uf",
          "regiao": {
            "id": "[&3].id_rgia",
            "sigla": "[&3].sgla_rgia"
          }
        }
      }
    }
  }
]

Solution

  • The following spec will give the expected output.

    [
      {
        "operation": "shift",
        "spec": {
          "*": {
            "sub-regioes-metropolitanas": {
              "*": {
                "municipios": {
                  "*": {
                    "@(4,id)": "&5_&3_&1.id_rgia_mptn",
                    "@4,nome": "&5_&3_&1.nome_rgia_mptn",
                    "@2,id": "&5_&3_&1.id_sub_rgia_mptn",
                    "@2,nome": "&5_&3_&1.nome_sub_rgia_mptn",
                    "id": "&5_&3_&1.id_mcpo",
                    "@4,UF.id": "&5_&3_&1.id_uf",
                    "@4,UF.sigla": "&5_&3_&1.sgla_uf",
                    "@4,UF.regiao.id": "&5_&3_&1.id_rgia",
                    "@4,UF.regiao.sigla": "&5_&3_&1.sgla_rgia"
                  }
                }
              }
            }
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "*": ""
        }
      }
    ]