
Arma pares clave-valor a partir de filas anidadas de campo/valor
La 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 BigQueryconvertBQToMySQLResults(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!