
Construindo pares chave-valor a partir de aninhamentos de linhas field/value
La Sagrada Familia, Barcelona, por Paolo Nicolello.
Repita comigo: "trabalhar com JSON aninhado é complicado!". Concorda? Com certeza! Agora que tiramos isso do caminho, vou logo dizendo: sou fã de JSON de cabo a rabo. É lógico, é universal e a maioria das linguagens usa o formato para criar estruturas de dados estilo hash-map com acesso rápido. Todo mundo sai ganhando!
Até você começar a aninhar.
Aí entra em cena uma horda de defensores dos benefícios do JSON aninhado, contra os que veem no JSON achatado o cálice sagrado do payload de API. A batalha silenciosa é tão acirrada que técnicas de achatamento se espalham pelos repositórios de hackers de plantão, com métodos como o caminho recursivo e o caminho não recursivo.
Saindo do ninho, recursivamente
Já viu o filme A Origem? É bom demais. Uma linha do tempo dentro de outra linha do tempo dentro de outra linha do tempo. E, quando tudo volta ao começo, você entende como as peças se encaixam. Do mesmo jeito, a recursão ocupa pouquíssimo espaço no código, mas dá conta de uma complexidade computacional enorme (leia-se "aninhada").
Beleza, chega de enrolação, vamos ao que interessa!
A API de query do BigQuery retorna JSON
Este é um exemplo da resposta da API do Google BigQuery depois de executar uma query:
https://gist.github.com/ebendutoit/b160b66f3ba4073686d277524d210b90
O schema mostra como os dados estão estruturados e as linhas indicam, com "f" para field e "v" para value, quais valores se encaixam no schema.
E aí, não fica bem mais fácil ler e manipular o JSON quando ele aparece assim?
https://gist.github.com/ebendutoit/07832a24d9cedf436cb394b7bc6ea136
Se você concorda, então está em boas mãos.
A solução
Aqui vai o código em node.js que faz essa transformação. Fique à vontade para usar, adaptar às suas necessidades e, no geral, simplificar a sua vida e deixar os seus dados mais felizes. A interface da função é:
convertBQToMySQLResults(schema, rows)e você passa os resultados do BigQuery assim:
// apiResponse is the payload you receive from a BigQuery query API // responseconvertBQToMySQLResults(apiResponse.schema.fields, apiResponse.rows)https://gist.github.com/ebendutoit/1717e5eba2f55ab23544153d2ef098a8
Uma demo no JsFiddle
Aqui vai uma demo no JsFiddle para você brincar com o código:
[wp-js-fiddle url="https://jsfiddle.net/ebendutoit/4rvgnob2/" style="width:100%; height:400px; border:solid #4173A0 1px;"]
Resumindo
Existem várias transformações para JSON por aí. Soluções recursivas não são as mais fáceis de depurar, mas têm o menor footprint de código. Percorrer o código com um debugger é a melhor forma de observar esse tipo de algoritmo em "câmera lenta". Este artigo apresenta uma maneira de achatar aquele JSON aninhado complicado vindo do Google BigQuery e transformá-lo em algo que você consegue manipular e usar do seu jeito. Experimente! Boas conversões!