
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
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 !