
Key-Value-Paare aus verschachtelten Field/Value-Zeilen erzeugen
Sagrada Família, Barcelona, von Paolo Nicolello.
Sagen Sie es mit mir: "Nested JSON nervt!". Stimmt's? Definitiv! Damit das gesagt ist: Ich bin durch und durch JSON-Fan. Logisch, universell, und in den meisten Sprachen lassen sich damit blitzschnelle Datenstrukturen im Hash-Map-Stil aufbauen. Ein Gewinn für alle!
Bis man es verschachtelt.
Dann betritt eine ganze Schar die Bühne: die einen schwören auf die Vorzüge verschachtelter JSON-Strukturen, die anderen sehen in flachem JSON den heiligen Gral jeder API-Payload. Dieser stille Glaubenskrieg tobt so heftig, dass unzählige Flattening-Techniken in den Repos zahlloser Hacker schlummern – etwa der rekursive Weg und der nicht-rekursive Weg.
Rekursiv aus dem Nest
Haben Sie schon mal Inception gesehen? Großes Kino. Eine Zeitebene in einer Zeitebene in einer Zeitebene. Und am Ende, wenn sich alles zurückrollt, fügt sich plötzlich alles zusammen. Mit Rekursion ist es ähnlich: Sie braucht im Code kaum Platz, bewältigt aber enorm komplexe (sprich: "verschachtelte") Berechnungen.
Okay, genug Vorgeplänkel – ran ans Werk!
Die Query-API von BigQuery liefert JSON
Hier ein Beispiel für die API-Antwort von Google BigQuery nach einer Query:
https://gist.github.com/ebendutoit/b160b66f3ba4073686d277524d210b90
Das Schema zeigt Ihnen, wie die Daten aufgebaut sind. Die Zeilen geben mit "f" für Field und "v" für Value an, welche Werte ins Schema gehören.
Lässt sich das JSON nicht deutlich angenehmer lesen und bearbeiten, wenn es so aussieht?
https://gist.github.com/ebendutoit/07832a24d9cedf436cb394b7bc6ea136
Wenn Sie nicken, sind Sie hier genau richtig.
Die Lösung
Hier ist der node.js-Code, der diese Umwandlung erledigt. Nutzen Sie ihn gerne, passen Sie ihn an Ihre Anforderungen an und machen Sie sich – und Ihren Daten – das Leben leichter. Die Funktionsschnittstelle lautet:
convertBQToMySQLResults(schema, rows)Und so übergeben Sie die BigQuery-Ergebnisse:
// apiResponse is the payload you receive from a BigQuery query API // responseconvertBQToMySQLResults(apiResponse.schema.fields, apiResponse.rows)https://gist.github.com/ebendutoit/1717e5eba2f55ab23544153d2ef098a8
Eine JsFiddle-Demo
Hier eine JsFiddle-Demo des Codes zum Ausprobieren:
[wp-js-fiddle url="https://jsfiddle.net/ebendutoit/4rvgnob2/" style="width:100%; height:400px; border:solid #4173A0 1px;"]
Fazit
Es gibt da draußen zahllose JSON-Transformationen. Rekursive Lösungen sind nicht die dankbarsten Kandidaten zum Debuggen, dafür aber besonders schlank im Code. Am besten geht man solche Algorithmen Schritt für Schritt mit einem Debugger durch – sozusagen in "Zeitlupe". Dieser Artikel zeigt einen Weg, komplex verschachteltes JSON aus Google BigQuery so zu glätten, dass Sie es nach Ihren eigenen Regeln weiterverarbeiten können. Probieren Sie es aus – und viel Spaß beim Umwandeln!