Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

BigQuery-JSON-API-Antworten rekursiv umwandeln

By Eben Du ToitMar 25, 20192 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

1 vnu9dfxo8kvsal2frcxeeg

Key-Value-Paare aus verschachtelten Field/Value-Zeilen erzeugen

1 vnu9dfxo8kvsal2frcxeegSagrada 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 // response
convertBQToMySQLResults(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!