Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Transformar respuestas JSON de la API de BigQuery con recursión

By Eben Du ToitMar 25, 20192 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

1 vnu9dfxo8kvsal2frcxeeg

Arma pares clave-valor a partir de filas anidadas de campo/valor

1 vnu9dfxo8kvsal2frcxeegLa Sagrada Familia, Barcelona, por Paolo Nicolello.

Dilo conmigo: "¡Trabajar con JSON anidado cuesta!". ¿Cierto? ¡Sin duda! Aclarado eso, déjame decirte que creo en el JSON al cien. Es lógico, es universal y la mayoría de los lenguajes lo usan para crear estructuras de datos tipo hash-map de acceso rápido. ¡Todos ganan!

Hasta que lo anidas.

Ahí entra en escena una horda de fieles a las bondades del JSON anidado y otros que veneran el JSON aplanado como su cáliz sagrado del payload de API. Tan feroz es esta batalla silenciosa que abundan las técnicas de aplanamiento regadas por los repositorios de hackers de toda índole, con métodos como la vía recursiva y la vía no recursiva.


Salir del nido, de forma recursiva

¿Viste la película Inception? Es buenísima. Una línea temporal dentro de otra línea temporal dentro de otra línea temporal. Y cuando todo se desenreda, ves cómo encajan las piezas. Algo parecido pasa con la recursión: ocupa muy poco en el código, pero puede resolver una enorme complejidad computacional (léase "anidada").

Bueno, basta de rodeos, ¡manos a la obra!

La API de consultas de BigQuery devuelve JSON

Esta es una muestra de la respuesta de la API de Google BigQuery después de ejecutar una consulta:

https://gist.github.com/ebendutoit/b160b66f3ba4073686d277524d210b90

El schema te muestra cómo se estructuran los datos, y las filas indican, con "f" para campo (field) y "v" para valor (value), qué valores corresponden al schema.

Ahora bien, ¿no resulta más fácil leer y manipular el JSON cuando se ve así?

https://gist.github.com/ebendutoit/07832a24d9cedf436cb394b7bc6ea136

Si estás de acuerdo, estás en buenas manos.

La solución

Acá tienes el código en node.js que hace esta transformación. Úsalo, adáptalo a tus necesidades y, en general, hazte la vida más simple y tus datos, más felices. La interfaz de la función es:

convertBQToMySQLResults(schema, rows)

y le pasas los resultados de BigQuery así:

// apiResponse es el payload que recibes de una respuesta de la API de consultas de BigQuery
convertBQToMySQLResults(apiResponse.schema.fields, apiResponse.rows)

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


Una demo en JsFiddle

Acá tienes una demo en JsFiddle del código para que la pruebes:

[wp-js-fiddle url="https://jsfiddle.net/ebendutoit/4rvgnob2/" style="width:100%; height:400px; border:solid #4173A0 1px;"]

En resumen

Existen muchísimas transformaciones para JSON. Las soluciones recursivas no son las más fáciles de depurar, pero su huella en el código es mínima. Recorrer el código paso a paso con un debugger es la mejor forma de ver este tipo de algoritmos en "cámara lenta". Este artículo te muestra una manera de aplanar JSON anidado y complicado proveniente de Google BigQuery, para convertirlo en algo que puedas manipular y usar a tu manera. ¡Pruébalo! ¡Feliz conversión!