Cloud Intelligence™
Transformer les réponses JSON de l'API BigQuery par récursion
Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et 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
Construire des paires clé-valeur à partir d'imbrications de lignes field/value
La Sagrada Familia, Barcelone, par Paolo Nicolello.
Répétez après moi : le JSON imbriqué, quel casse-tête à manipuler ! J'ai raison, n'est-ce pas ? Évidemment ! Cela étant dit, sachez que je suis un fervent défenseur du JSON. C'est logique, universel, et la plupart des langages s'en servent pour créer des structures de données de type hash-map à accès rapide. Tout le monde y gagne !
Jusqu'au moment où on l'imbrique.
Entrent alors en scène une horde d'adeptes des vertus du JSON imbriqué, face à ceux qui voient dans le JSON aplati le calice ultime de la béatitude pour les payloads d'API. Cette bataille silencieuse est si féroce que d'innombrables techniques d'aplatissement peuplent les dépôts des hackers, avec des méthodes comme la voie récursive et la voie non récursive.
Quitter le nid, par récursion
Vous avez vu le film Inception ? Un petit bijou. Une trame temporelle dans une trame temporelle dans une trame temporelle. Et quand tout se déroule à rebours, on comprend comment les pièces s'emboîtent. La récursion fonctionne de la même manière : très peu de code, mais elle s'attaque à une complexité computationnelle (autrement dit imbriquée) considérable.
Bon, assez bavardé, passons aux choses sérieuses !
L'API de requête de BigQuery renvoie du JSON
Voici un exemple de réponse de l'API Google BigQuery après l'exécution d'une requête :
https://gist.github.com/ebendutoit/b160b66f3ba4073686d277524d210b90
Le schéma indique la structure des données et les lignes précisent, avec f pour field et v pour value, quelles valeurs viennent s'inscrire dans le schéma.
N'est-il pas plus simple de lire et de manipuler le JSON quand il ressemble à ceci ?
https://gist.github.com/ebendutoit/07832a24d9cedf436cb394b7bc6ea136
Si vous en convenez, vous êtes entre de bonnes mains.
La solution
Voici le code node.js qui effectue cette transformation. Utilisez-le, adaptez-le à vos besoins et, plus largement, simplifiez-vous la vie tout en faisant le bonheur de vos données. L'interface de la fonction est la suivante :
convertBQToMySQLResults(schema, rows)et vous lui transmettez les résultats BigQuery ainsi :
// 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.
Une démo JsFiddle
Voici une démo JsFiddle du code, à manipuler à votre guise :
[wp-js-fiddle url="https://jsfiddle.net/ebendutoit/4rvgnob2/" style="width:100%; height:400px; border:solid #4173A0 1px;"]
En résumé
Il existe une multitude de transformations pour le JSON. Les solutions récursives ne sont pas les plus simples à déboguer, mais elles offrent l'empreinte de code la plus concise. Pour observer ces algorithmes au ralenti, rien ne vaut un pas-à-pas dans le code avec un débogueur. Cet article propose une façon d'aplatir un JSON imbriqué et complexe issu de Google BigQuery pour en faire quelque chose de manipulable à votre convenance. À vous de jouer ! Bonne conversion !