Cloud Intelligence™
Transformando respostas JSON da API do BigQuery recursivamente
Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.
About Eben Du Toit
I lead engineering teams in the Partner Channel space, building the tooling that helps customers make sense of their revenue — turning complex partner and billing data into something they can actually see, trust, and act on. The work sits at the intersection of cloud cost management, FinOps, and billing integrations, with data flowing across GCP, BigQuery, MongoDB Atlas, Snowflake, and the wider cloud ecosystem. It's technically meaty, and I love that about it.
My days are split between people and systems — growing and aligning multiple teams, helping the team navigate the environment, hiring, and partnering with stakeholders across the org. I shift between maker mode and manager mode depending on what's needed: sometimes I'm deep in the code building features, sometimes I'm in the room helping my teams move forward. I care a lot about building teams where good engineers can do their best work.
What I work on
Partner Channel engineering and revenue management tooling · Cloud cost management and FinOps · Billing data pipelines and integrations · Engineering leadership, hiring, and team process
Good topics to find me for
Anything Partner Channel, revenue, FinOps, or billing-related · Data engineering and pipeline architecture · Engineering management, hiring, or team culture
Outside work
When I'm not in a terminal, I'm usually behind a camera — shooting on a Nikon Z or whatever vintage film body I'm currently infatuated with. I follow mountain biking and trail running closely, have strong opinions about mechanical keyboards and good stationery, and watch more anime than I probably admit. I also play Rocket League with more optimism than results.
Cape Town · SAST (UTC+2)
My personal page
Construindo pares chave-valor a partir de aninhamentos de linhas field/value
La Sagrada Familia, Barcelona, por Paolo Nicolello.
Repita comigo: "trabalhar com JSON aninhado é complicado!". Concorda? Com certeza! Agora que tiramos isso do caminho, vou logo dizendo: sou fã de JSON de cabo a rabo. É lógico, é universal e a maioria das linguagens usa o formato para criar estruturas de dados estilo hash-map com acesso rápido. Todo mundo sai ganhando!
Até você começar a aninhar.
Aí entra em cena uma horda de defensores dos benefícios do JSON aninhado, contra os que veem no JSON achatado o cálice sagrado do payload de API. A batalha silenciosa é tão acirrada que técnicas de achatamento se espalham pelos repositórios de hackers de plantão, com métodos como o caminho recursivo e o caminho não recursivo.
Saindo do ninho, recursivamente
Já viu o filme A Origem? É bom demais. Uma linha do tempo dentro de outra linha do tempo dentro de outra linha do tempo. E, quando tudo volta ao começo, você entende como as peças se encaixam. Do mesmo jeito, a recursão ocupa pouquíssimo espaço no código, mas dá conta de uma complexidade computacional enorme (leia-se "aninhada").
Beleza, chega de enrolação, vamos ao que interessa!
A API de query do BigQuery retorna JSON
Este é um exemplo da resposta da API do Google BigQuery depois de executar uma query:
https://gist.github.com/ebendutoit/b160b66f3ba4073686d277524d210b90
O schema mostra como os dados estão estruturados e as linhas indicam, com "f" para field e "v" para value, quais valores se encaixam no schema.
E aí, não fica bem mais fácil ler e manipular o JSON quando ele aparece assim?
https://gist.github.com/ebendutoit/07832a24d9cedf436cb394b7bc6ea136
Se você concorda, então está em boas mãos.
A solução
Aqui vai o código em node.js que faz essa transformação. Fique à vontade para usar, adaptar às suas necessidades e, no geral, simplificar a sua vida e deixar os seus dados mais felizes. A interface da função é:
convertBQToMySQLResults(schema, rows)e você passa os resultados do BigQuery assim:
// apiResponse is the payload you receive from a BigQuery query API // responseconvertBQToMySQLResults(apiResponse.schema.fields, apiResponse.rows)https://gist.github.com/ebendutoit/1717e5eba2f55ab23544153d2ef098a8
Cloud bill shouldn't be a mystery
One platform for AI and Cloud optimization.
Uma demo no JsFiddle
Aqui vai uma demo no JsFiddle para você brincar com o código:
[wp-js-fiddle url="https://jsfiddle.net/ebendutoit/4rvgnob2/" style="width:100%; height:400px; border:solid #4173A0 1px;"]
Resumindo
Existem várias transformações para JSON por aí. Soluções recursivas não são as mais fáceis de depurar, mas têm o menor footprint de código. Percorrer o código com um debugger é a melhor forma de observar esse tipo de algoritmo em "câmera lenta". Este artigo apresenta uma maneira de achatar aquele JSON aninhado complicado vindo do Google BigQuery e transformá-lo em algo que você consegue manipular e usar do seu jeito. Experimente! Boas conversões!