JSON aninhado em uma tabela plana
O JSON é uma árvore e uma tabela é um retângulo. Traduzir uma coisa na outra é sempre um compromisso, e é importante entender qual compromisso você está escolhendo.
Objetos aninhados: fácil
Um objeto dentro de outro é desdobrado em colunas unidas por um ponto:
{"id": 1, "dono": {"sobrenome": "Silva", "nome": "Ana"}} → colunas id, dono.sobrenome, dono.nome.
Nada se perde e os nomes continuam claros. A única sutileza é a profundidade: no quinto nível de aninhamento os nomes ficam ilegíveis, então vale parar em uma profundidade razoável e deixar o resto como está.
Arrays: aqui começa a escolha
Um array de valores simples — "tags": ["a", "b"] — é unido, com bom senso, em um texto a, b. Lê-se bem, dá para achar pela busca e não gera colunas.
Um array de objetos — "itens": [{...}, {...}] — já é uma segunda tabela dentro da primeira. Há três opções:
- deixá-lo como um texto JSON na célula — nada se perde, mas você não consegue trabalhar com ele;
- desdobrar em colunas
itens.0.nome,itens.1.nome— serve quando há exatamente dois ou três elementos e sempre os mesmos; - fazer do array uma tabela própria — a resposta certa quando há muitos elementos.
A terceira opção é a escolha de “o que conta como linha”. Ela também resolve a mesma tarefa no XML e é descrita no artigo sobre achatar XML: a mecânica é idêntica, só a sintaxe muda.
Chaves diferentes em objetos diferentes
Ninguém prometeu que todo elemento de um array tem o mesmo conjunto de campos. Metade dos registros pode nem ter o campo dono.
As colunas são montadas como a união das chaves: se um campo ocorre em pelo menos um elemento, a coluna aparece e fica vazia para os demais. Isso é mais honesto que pegar as chaves do primeiro elemento, o que faria parte dos dados sumir em silêncio.
Uma consequência prática: quando você vir uma coluna preenchida em só 3% das linhas, não corra a chamá-la de erro. Provavelmente é assim que a origem é construída.
Onde a tabela realmente está
Exportações de API raramente são um array puro. Mais frequentemente são um objeto com metadados, e os dados estão em algum lugar dentro:
{"status": "ok", "dados": {"total": 1500, "itens": [ ... ]}}
O array precisa ser procurado em todo o documento, não só na raiz, e com vários candidatos deve-se propor o maior array de objetos — em geral são os dados. Mas a decisão deve ficar com a pessoa: às vezes você precisa justamente da lista pequena de consulta. No Tabulens você escolhe em Leitura do arquivo.
Perguntas frequentes
Por que há uma coluna com valores como {"a":1}?
É um objeto aninhado que não foi desdobrado — ou o desdobramento está desligado ou o limite de profundidade foi excedido.
Posso transformar a tabela de volta em JSON?
Pode, há exportação para JSON e JSON Lines. As colunas planas com ponto continuam planas, porém: o aninhamento original não é restaurado.
E se as chaves do meu JSON não forem em inglês?
Nada de especial: elas viram nomes de coluna como estão, com acentos e tudo. Só há problemas na exportação para DBF, onde o nome de um campo não pode passar de dez caracteres.
Grátis para uso pessoal. Seu arquivo não é enviado a nenhum servidor. Versão para Windows — 3.5 MB, sem instalação: detalhes. Para organizações — licença.