Cloud Intelligence™
Trasformare in modo ricorsivo le risposte JSON dell'API di BigQuery
Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.
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
Come costruire coppie chiave-valore a partire da righe annidate field/value
La Sagrada Familia, Barcellona, foto di Paolo Nicolello.
Diciamolo insieme: "lavorare con il JSON annidato è una bella gatta da pelare!". Ho ragione? Eccome! Tolto questo dai piedi, lasciatemi dire che credo nel JSON in tutto e per tutto. È logico, è universale e la maggior parte dei linguaggi lo usa per creare strutture dati in stile hash-map ad accesso rapido. Ci guadagnano tutti!
Almeno finché non lo si annida.
Ed è qui che entra in scena un'orda di sostenitori del JSON annidato, contrapposta a chi vede nel JSON appiattito il calice prediletto della beatitudine in fatto di payload API. La battaglia silenziosa è così accesa che le tecniche di flattening abbondano nei repository degli hacker, con metodi come quello ricorsivo e quello non ricorsivo.
Lasciare il nido, in modo ricorsivo
Avete mai visto il film Inception? Un piccolo gioiello. Una linea temporale dentro una linea temporale dentro un'altra linea temporale. E quando il tutto si riavvolge, capite finalmente come ogni pezzo si incastra. Allo stesso modo, la ricorsione occupa pochissime righe di codice ma sa affrontare una complessità computazionale (leggi: "annidata") enorme.
Bando alle ciance, mettiamoci all'opera!
L'API di query di BigQuery restituisce JSON
Ecco un esempio di risposta dell'API di Google BigQuery dopo l'esecuzione di una query:
https://gist.github.com/ebendutoit/b160b66f3ba4073686d277524d210b90
Lo schema mostra come sono strutturati i dati, mentre le righe indicano — con "f" per field e "v" per value — quali valori si inseriscono nello schema.
Non è molto più semplice leggere e manipolare il JSON quando si presenta così?
https://gist.github.com/ebendutoit/07832a24d9cedf436cb394b7bc6ea136
Se siete d'accordo, allora siete nel posto giusto.
La soluzione
Ecco il codice node.js che esegue questa trasformazione. Usatelo pure, adattatelo alle vostre esigenze e in generale rendete più semplice la vostra vita (e più felici i vostri dati). L'interfaccia della funzione è la seguente:
convertBQToMySQLResults(schema, rows)e i risultati di BigQuery si passano in questo modo:
// 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.
Una demo su JsFiddle
Qui trovate una demo del codice su JsFiddle con cui sperimentare:
[wp-js-fiddle url="https://jsfiddle.net/ebendutoit/4rvgnob2/" style="width:100%; height:400px; border:solid #4173A0 1px;"]
In sintesi
Di trasformazioni per il JSON in giro ce ne sono moltissime. Le soluzioni ricorsive non sono certo le più facili da debuggare, ma sono quelle con il footprint di codice più snello. Procedere passo passo con un debugger è il modo migliore per osservare questi algoritmi al "rallentatore". Questo articolo propone un approccio per appiattire JSON annidati complessi provenienti da Google BigQuery e trasformarli in qualcosa di facilmente manipolabile e riutilizzabile a piacimento. Provatelo! Buona conversione!