Converter CSV em JSON
O CSV para JSON lê uma exportação de planilha e a transforma em um array de registros no seu navegador. Ele lê o RFC 4180 direito — campos entre aspas contendo vírgulas, novas linhas e aspas escapadas sobrevivem — infere tipos escalares e reconstrói objetos e arrays aninhados a partir de nomes de coluna com pontos ou colchetes.
Como funciona o Converter CSV em JSON?
A implementação ingênua dessa conversão é uma linha só — line.split(",") — e está errada para boa parte dos arquivos reais. Um campo CSV pode vir entre aspas, e um campo entre aspas pode conter o delimitador, uma nova linha literal e aspas duplicadas representando uma única. Dividir pelas vírgulas transforma "Hopper, G." em dois campos e desloca toda coluna seguinte em um, o que corrompe o registro em vez de falhar nele.
Por isso o parser aqui é uma máquina de estados explícita sobre o fluxo de caracteres, acompanhando se está dentro de uma região entre aspas, exatamente como o RFC 4180 descreve. Ele também trata o que o RFC não menciona mas arquivos reais contêm: uma marca de ordem de bytes UTF-8 antes do primeiro nome de coluna, finais de linha CRLF e LF puros misturados no mesmo arquivo, uma nova linha final que, de outro modo, produziria um registro vazio fantasma, e uma aspa solta no meio de um campo sem aspas, que o Excel escreve e que é tomada literalmente em vez de tratada como fatal.
A detecção de delimitador conta candidatos na linha de cabeçalho — vírgula, ponto e vírgula, tab, pipe — mas apenas fora das regiões entre aspas. Um arquivo cujo cabeçalho é name,description, com ponto e vírgula dentro das descrições entre aspas, seria dividido pelo caractere errado se não fosse assim — o tipo de bug que parece dado corrompido em vez de configuração errada.
A inferência de tipos é conservadora de propósito. Uma célula que casa com a gramática de número do JSON vira número, true / false viram booleanos, e null vira null. Todo o resto permanece string — incluindo 007, porque a gramática proíbe zeros à esquerda e um número de peça não pode ser renumerado; e incluindo inteiros além de 2 53, porque converter esses descarta dígitos de vez.
Por fim, nomes de coluna que parecem caminhos são tratados como caminhos: customer.name reconstrói um objeto aninhado, tags[0] reconstrói um array. Como esses nomes vêm do arquivo, são entrada não confiável sendo usada para indexar um objeto — uma coluna chamada a.__proto__.polluted é um payload de poluição de protótipo, e é recusada em vez de seguida.
CSV de entrada
id,user.name,tags[0],tags[1] 1,Ada,a,b 2,"Hopper, G.",c,
JSON de saída
[
{ "id": 1, "user": { "name": "Ada" }, "tags": ["a", "b"] },
{ "id": 2, "user": { "name": "Hopper, G." }, "tags": ["c"] }
]CSV de entrada → JSON de saída
CSV de entrada
id,name,joined 1,Ada,1815-12-10 2,Grace,1906-12-09
JSON de saída
[
{
"id": 1,
"name": "Ada",
"joined": "1815-12-10"
},
{
"id": 2,
"name": "Grace",
"joined": "1906-12-09"
}
]Quais opções e casos-limite o Converter CSV em JSON suporta?
| Parâmetro | Tipo | Padrão | Comportamento e casos-limite |
|---|---|---|---|
| Delimitador | auto | , ; tab | | automático | O modo automático conta os candidatos na linha de cabeçalho, ignorando qualquer coisa dentro de aspas. Substitua quando o cabeçalho de um arquivo não for representativo do seu corpo. |
| Linha de cabeçalho | booleano | true | A primeira linha fornece as chaves. Com essa opção desligada, as chaves são coluna1, coluna2 e assim por diante. Uma célula de cabeçalho vazia também recorre a um nome posicional para que o registro nunca perca uma chave. |
| Inferir tipos | booleano | true | Aplica a gramática de número do JSON mais true/false/null. "007", "+1", "0x10" e "1,5" permanecem como strings. Desative quando todas as colunas devem permanecer como texto — uma coluna de ID cheia de dígitos é o motivo usual. |
| Expandir caminhos | booleano | true | Reconstrói aninhamentos a partir de customer.name e tags[0]. Com essa opção desligada, você obtém um objeto plano cujas chaves são os nomes literais das colunas, o que é desejado quando uma coluna é genuinamente chamada "user.name". |
| Células vazias | omitir | manter | omitir | CSV não consegue distinguir um campo ausente de uma string vazia. Omitir é o padrão melhor porque o conjunto de colunas é uma união: um registro que simplesmente não possui tags[1] é escrito como uma célula vazia, exatamente como um cujo tags[1] é "". |
| Campos entre aspas | RFC 4180 | — | Um campo entre aspas pode conter o delimitador, CR, LF e aspas duplicadas. Uma aspa não finalizada é um erro grave com linha e coluna, porque truncar silenciosamente produziria uma saída plausivelmente errada. |
| Linhas irregulares | aviso | — | Uma linha com o número incorreto de campos é mantida, não descartada: campos ausentes são omitidos e extras ignorados, com um aviso dizendo quantas linhas foram afetadas. |
| Colunas duplicadas | aviso | a mais à direita vence | Corresponde ao comportamento de importação de planilha. É emitido um aviso explícito, porque descartar silenciosamente uma coluna que o usuário pode ver no arquivo é pior do que informar. |
Perguntas frequentes
Por que meu arquivo converte errado quando um campo contém vírgula?
Não deveria — este parser acompanha as aspas corretamente, então "Hopper, G." permanece um campo. Se um conversor o divide em dois, é porque está dividindo por vírgulas sem considerar aspas, que é o bug de CSV mais comum de todos. Se acontecer aqui, verifique se o campo está realmente entre aspas no arquivo de origem: uma vírgula sem aspas é genuinamente ambígua e nenhum parser consegue recuperá-la.
Por que os zeros à esquerda da minha coluna de ID continuam sumindo?
Não aqui — "007" permanece string, porque a gramática de número do JSON proíbe zeros à esquerda, e é exatamente essa regra que protege números de peça, códigos postais e referências de conta. Se os zeros estão sumindo, aconteceu na planilha antes da exportação: o Excel os remove na importação, a menos que a coluna esteja definida como Texto. Se você quer toda coluna mantida como texto, desative Inferir tipos.
O que customer.name em um cabeçalho faz?
Ele reconstrói um objeto aninhado: {"customer":{"name":"…"}}. Nomes com colchetes, como tags[0], reconstruem arrays. Este é o inverso do que o JSON para CSV escreve, então um documento sobrevive a uma ida e volta pela planilha. Se suas colunas realmente têm pontos no nome e você quer que fiquem literais, desative Expandir caminhos.
Ele lida com um arquivo com novas linhas dentro de um campo?
Sim, desde que o campo esteja entre aspas, como o RFC 4180 exige. Um endereço ou comentário de várias linhas é comum em exportações e é tratado corretamente. O que não dá para tratar é uma nova linha sem aspas no meio de um registro, porque nada a distingue do fim da linha.
Qual o tamanho de arquivo que posso converter?
Até 8 MB. A conversão roda na thread principal, e acima desse teto ela é recusada com uma mensagem em vez de tentada, porque tentar travaria a aba. Nada é enviado, em nenhum tamanho — o arquivo é lido pelo seu navegador e nunca vai para lugar nenhum.
Os dados da minha planilha são enviados a um servidor?
Não. A análise acontece na página que você já tem aberta. Isso importa de forma especial nesta ferramenta, porque uma exportação CSV costuma conter registros reais — clientes, pedidos, folha de pagamento — e mandar um para um endpoint desconhecido só para reformatar é uma divulgação que você não pode desfazer. Abra o painel Network e observe enquanto cola.