Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Trasformare in modo ricorsivo le risposte JSON dell'API di BigQuery

By Eben Du ToitMar 25, 20192 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

1 vnu9dfxo8kvsal2frcxeeg

Come costruire coppie chiave-valore a partire da righe annidate field/value

1 vnu9dfxo8kvsal2frcxeegLa 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 // response
convertBQToMySQLResults(apiResponse.schema.fields, apiResponse.rows)

https://gist.github.com/ebendutoit/1717e5eba2f55ab23544153d2ef098a8


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!