← Todos os artigos

Como converter CSV e XML para JSON

Converta CSV e XML para JSON em JavaScript, Python e no navegador. Cobre o mapeamento array-de-objetos, manuseio de atributos XML e as pegadinhas de coerção de tipo.

CSV e XML estão em todo lugar —— exports de planilha, APIs legadas, feeds corporativos —— mas a maior parte do código moderno quer JSON. Converter entre eles é direto quando você entende as regras de mapeamento e as armadilhas (tudo em CSV é string; atributos XML e elementos repetidos precisam de tratamento especial). Este guia cobre as duas conversões em JavaScript, Python e no navegador.

Escopo: este artigo é o how-to amplo que cobre CSV → JSON e XML → JSON no mesmo lugar. Se você precisa especificamente de XML —— atributos, nós de texto, elementos repetidos e namespaces em profundidade —— leia Conversão XML para JSON: atributos, nós de texto, arrays e namespaces. Para o sentido inverso, veja JSON para XML.

Convertendo CSV em JSON

Um arquivo CSV é linhas de valores separados por vírgula, geralmente com uma linha de cabeçalho. A representação JSON natural é um array de objetos, um por linha, indexados pelo cabeçalho:

# CSV
id,name,active
1,Ada,true
2,Bob,false
// JSON
[
  { "id": "1", "name": "Ada", "active": "true" },
  { "id": "2", "name": "Bob", "active": "false" }
]

Note que cada valor é uma string —— CSV não tem tipos. Converter "1" em número ou "true" em booleano é um passo de coerção separado que você precisa fazer de propósito.

CSV para JSON em JavaScript

Para CSV simples e confiável você pode dar split manual —— mas CSV real tem campos entre aspas com vírgulas e quebras de linha, então em produção use um parser de verdade como papaparse:

// Parser mínimo —— só seguro para CSV simples, sem aspas
function csvToJson(csv) {
  const [header, ...rows] = csv.trim().split('\n');
  const keys = header.split(',');
  return rows.map((row) => {
    const values = row.split(',');
    return Object.fromEntries(keys.map((k, i) => [k, values[i]]));
  });
}

// Produção —— lida com aspas, vírgulas internas, quebras de linha
import Papa from 'papaparse';
const result = Papa.parse(csvText, { header: true, dynamicTyping: true });
// dynamicTyping converte "1" → 1 e "true" → true automaticamente

CSV para JSON em Python

import csv, json

with open('data.csv', newline='') as f:
    rows = list(csv.DictReader(f))   # lista de dicts indexados pelo cabeçalho

print(json.dumps(rows, indent=2))

Convertendo XML em JSON

XML é mais complicado porque tem conceitos que faltam ao JSON: atributos, nós de texto e elementos único-vs-repetido. Não existe um único mapeamento „correto“, então escolha uma convenção e aplique de forma consistente.

<!-- XML -->
<user id="1">
  <name>Ada</name>
  <role>admin</role>
  <role>editor</role>
</user>
// Um mapeamento JSON comum
{
  "user": {
    "@id": "1",                    // atributo, com prefixo @
    "name": "Ada",                 // filho único → valor
    "role": ["admin", "editor"]    // filho repetido → array
  }
}

XML para JSON em JavaScript

import { XMLParser } from 'fast-xml-parser';

const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@' });
const obj = parser.parse(xmlString);
// No navegador você também pode usar DOMParser e percorrer a árvore de nós manualmente.

XML para JSON em Python

import xmltodict, json

doc = xmltodict.parse(xml_string)   # atributos viram chaves "@name"
print(json.dumps(doc, indent=2))

Armadilhas de mapeamento a observar

  • Os tipos somem. Valores de CSV e XML chegam como strings. Faça coerção de números e booleanos explicitamente —— não assuma que o parser fez por você.
  • Único vs repetido. Um <role> vira valor; dois viram array. Decida se um campo deve ser sempre array para não pegar consumidores de surpresa.
  • Atributos vs elementos filhos.Escolha uma convenção de prefixo (comumente @) e documente.
  • Valores vazios e espaços. Elementos XML vazios e vírgulas finais em CSV podem produzir null, "" ou chaves ausentes dependendo do parser.

BOM e esquisitices de codificação

Arquivos exportados do Excel e de algumas ferramentas Windows começam com um BOM UTF-8 (0xEF 0xBB 0xBF). Tire antes de fazer parse, senão seu primeiro cabeçalho/nome de elemento vai incluí-lo em silêncio. A RFC 8259 proíbe BOM no início do JSON, então qualquer conversor que você construir deve removê-lo da entrada em vez de copiar para a saída.

TSV vs CSV (e outros delimitadores)

„CSV“ nem sempre é separado por vírgulas. Valores separados por tabulação (TSV) são comuns em pipelines de engenharia porque tabs quase nunca aparecem dentro de valores, então você pula a máquina de aspas. Exports do Excel europeu costumam usar ;. Se sua saída parece uma coluna estranha, o arquivo usa um delimitador diferente do que seu parser espera —— troque o delimitador ou use uma biblioteca que detecte.

Namespaces XML

Elementos XML podem ser qualificados com prefixo de namespace (ex.: <soap:Envelope>) ligados por uma declaração xmlns. JSON não tem conceito de namespace, então a maioria dos conversores segue um de três caminhos: manter o prefixo na chave ("soap:Envelope"), tirá-lo, ou guardar declarações xmlns como atributos @xmlns:*. Manter o prefixo é a única opção sem perda. Para o aprofundamento, veja Conversão XML para JSON.

Valide e formate o resultado

Depois de converter, confirme que a saída está bem-formada e legível:

Perguntas frequentes

Como converto CSV em JSON?

Faça parse do CSV em linhas e mapeie cada uma para um objeto indexado pelo cabeçalho —— use csv.DictReader em Python ou uma biblioteca como papaparse em JavaScript. Lembre-se que todos os valores começam como strings; faça a coerção de tipos você.

Por que todos os meus valores CSV-para-JSON são strings?

CSV não tem tipos —— cada campo é texto. Ative coerção de tipos (ex.: dynamicTyping do papaparse) ou converta números e booleanos explicitamente depois do parse.

Como lidar com atributos XML ao converter para JSON?

A maioria dos conversores mapeia atributos para chaves com prefixo como @ (ex.: @id). Escolha uma convenção e aplique de forma consistente para que o código a jusante saiba onde olhar.

Por que minha saída XML-para-JSON às vezes dá objeto e às vezes array?

Um elemento filho único mapeia para um valor; um elemento repetido mapeia para um array. Configure seu parser para tratar certos elementos sempre como arrays se os consumidores esperam um formato consistente.

Converta, valide e formate no seu navegador