Pular para o conteúdo principal

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.

Só local
CSV
0 B1 linhaLin. 1, Col. 1
JSONsomente leitura
0 B1 linha

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?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
Delimitadorauto | , ; tab |automáticoO 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çalhobooleanotrueA 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 tiposbooleanotrueAplica 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 caminhosbooleanotrueReconstró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 vaziasomitir | manteromitirCSV 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 aspasRFC 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 irregularesaviso—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 duplicadasavisoa mais à direita venceCorresponde 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.