Por que transformar uma planilha em JSON
CSV é o que planilhas, CRMs, bancos e painéis de análise exportam. JSON é o que APIs web, código JavaScript, bancos NoSQL e a maioria dos sistemas de configuração consomem. A conversão aparece o tempo todo: popular um banco de testes a partir de uma planilha que um colega mantém, transformar uma lista de produtos em fixtures para um protótipo de front-end, alimentar um script de build com uma lista de redirecionamentos ou traduções, ou enviar um lote de registros para uma API que só aceita JSON.
A saída aqui é um array JSON com um objeto por linha de dados. A linha de cabeçalho fornece os nomes das propriedades, então uma planilha com as colunas sku, title e price vira objetos com exatamente essas três chaves, prontos para percorrer num loop.
Como o parser lê o seu CSV
CSV parece trivial até um valor conter o separador. O parser segue as regras da RFC 4180, o mais perto que o CSV tem de um padrão:
- Um campo entre aspas duplas pode conter o delimitador, quebras de linha e aspas.
"Smith, John"continua sendo um único valor. - Uma aspa dentro de um campo entre aspas é escrita duas vezes:
"6"" pipe"vira6" pipe. - As linhas podem terminar com CRLF, no estilo Windows, ou LF, no estilo Unix; as duas são tratadas.
- Uma marca de ordem de bytes (BOM) no início, que o Excel acrescenta ao salvar como CSV UTF-8, é removida para não ficar grudada no nome da primeira coluna.
- Linhas completamente vazias são ignoradas.
O delimitador é escolhido contando vírgulas, pontos e vírgulas, tabs e pipes na primeira linha e pegando o mais frequente. Isso funciona em quase toda exportação, mas depende de o cabeçalho ser representativo. Se o cabeçalho tiver uma única coluna, sem separadores, assume-se a vírgula.
Espaços em volta dos nomes do cabeçalho são removidos, então price vira a chave price. Os valores nas linhas de dados são mantidos exatamente como foram escritos, inclusive com espaços no início ou no fim.
Valores tipados versus strings
Com "Detectar números e booleanos" ativado, cada célula é verificada contra uma pequena lista de regras:
- Inteiros e decimais simples como
42,-7e19.99viram números JSON, desde que tenham no máximo 15 dígitos. - Exatamente
trueefalse, em minúsculas, viram booleanos.TRUE,Yesou1ficam como estão. - Uma célula vazia vira
null. - Todo o resto, incluindo sequências de dígitos mais longas,
1.5e3,+5,.5,1,234e datas, continua como string.
Isso é prático para a maioria dos dados, mas números em JSON não carregam formatação, então alguns valores mudam de sentido ao serem tipados:
- Zeros à esquerda desaparecem. Um CEP como
02134vira2134, e um código de artigo007vira7. - Sequências longas de dígitos perderiam precisão. Números em JavaScript só são exatos até uns 15 dígitos significativos, então valores com mais dígitos, como um ID de pedido de 20 dígitos ou um número de cartão, são mantidos como strings em vez de serem arredondados.
- Números de telefone sem sinal de mais ou espaços também viram números.
Se alguma coluna guarda identificadores e não quantidades, desative a opção e converta no seu próprio código os poucos campos realmente numéricos. Com a opção desativada, células vazias viram strings vazias em vez de null.
Quando a saída parece errada
- Tudo cai numa única chave. O delimitador não foi detectado, normalmente porque o cabeçalho tem um separador diferente dos dados, ou nenhum separador. Confira a primeira linha.
- Os valores estão deslocados em uma coluna. Um campo contém o delimitador, mas não está entre aspas. Exporte de novo do aplicativo de origem em vez de editar à mão; as planilhas colocam esses campos entre aspas automaticamente.
- Colunas extras somem. As chaves vêm só do cabeçalho, então células além da última coluna do cabeçalho são descartadas. Linhas com menos células recebem
nullou uma string vazia nas que faltam. - Duas colunas, uma chave. Se o cabeçalho repete um nome, a coluna posterior sobrescreve a anterior em todos os objetos. Renomeie uma delas antes.
- Caracteres estranhos como é. O arquivo foi salvo numa codificação antiga. Salve de novo como CSV UTF-8 e cole outra vez.
Trabalhando com o resultado
O JSON é exibido com recuo de 2 espaços, o que é bom para leitura e para fazer commit num repositório. Para minificá-lo para uma requisição de API ou mudar o recuo, passe-o pelo formatador de JSON. Para fazer o caminho inverso depois de editar, o JSON para CSV reconstrói uma planilha a partir do array. A conversão roda inteiramente na página, o que importa quando a exportação contém nomes de clientes, e-mails ou salários.