JSON vs CSV (2026): Quando Usar Cada Formato e Como Converter
JSON e CSV são os dois formatos mais usados para troca de dados tabulares, mas cada um brilha em cenários diferentes. Este comparativo cobre diferenças técnicas reais (tipos, hierarquia, performance), casos de uso por audiência, limitações práticas e código de conversão entre os formatos.
Por Vitor Morais
Fundador do MochaLabz ·
Formate e valide JSON
Cole JSON, detecte erros de sintaxe e formate com indentação correta.
Usar formatador →JSON e CSV são, juntos, responsáveis por 95% da troca de dados tabulares em qualquer sistema moderno. API devolve JSON, planilha devolve CSV. Dashboard exporta CSV; aplicação mobile consome JSON. A dúvida “qual formato usar?” aparece em todo projeto de dados, e a resposta certa depende de fatores que raramente são explicados claramente.
Este guia é o comparativo completo: diferenças técnicas reais (tipos, hierarquia, overhead), cenários onde cada um brilha, limitações práticas, código de conversão nos dois sentidos e quando considerar alternativas modernas como Parquet e NDJSON.
Diferenças estruturais fundamentais
JSON: hierárquico e tipado
[
{
"id": 1,
"nome": "João",
"valor": 1500.50,
"ativo": true,
"criadoEm": "2026-04-20T12:00:00Z",
"endereco": {
"cidade": "São Paulo",
"uf": "SP"
},
"tags": ["vip", "recorrente"]
},
{
"id": 2,
"nome": "Maria",
"valor": 890.00,
"ativo": false,
"criadoEm": "2026-04-18T09:30:00Z",
"endereco": {
"cidade": "Rio de Janeiro",
"uf": "RJ"
},
"tags": []
}
]CSV: plano e texto
id,nome,valor,ativo,criadoEm,endereco_cidade,endereco_uf,tags
1,João,1500.50,true,2026-04-20T12:00:00Z,São Paulo,SP,"vip,recorrente"
2,Maria,890.00,false,2026-04-18T09:30:00Z,Rio de Janeiro,RJ,Observações:
- CSV teve que “achatar”
endereco.cidade→ colunaendereco_cidade. tags: [](array vazio) virou célula vazia em CSV — ambiguidade com null.true/falseviraram texto em CSV (consumidor precisa converter de volta).1500.50é número em JSON, texto em CSV.
Tabela comparativa completa
| Critério | JSON | CSV |
|---|---|---|
| Tipos de dados | string, number, bool, null, array, object | Apenas string |
| Hierarquia | Sim (objetos aninhados, arrays) | Não (plano) |
| Suporte a arrays dentro de campo | Nativo | Precisa serializar como string |
| Tamanho em bytes (mesmos dados) | 30-60% maior (chaves repetidas) | Menor (só valores) |
| Compressão gzip | Excelente (70-90%) | Boa (60-80%) |
| Parse em JavaScript | JSON.parse nativo, <5ms | Precisa biblioteca (PapaParse) |
| Abertura em Excel | Não abre | Abre direto |
| Integração com Pandas/R | pd.read_json() | pd.read_csv() |
| Streaming (linha-a-linha) | Com NDJSON; JSON puro precisa parse completo | Nativo |
| Suporte em APIs REST | Padrão absoluto | Raro |
| Suporte em planilhas | Raro | Padrão absoluto |
| Legibilidade humana | Alta em pequeno, baixa em massa | Alta em massa, plana |
Casos de uso onde JSON vence
1. APIs REST e GraphQL
Padrão universal. Content-Type: application/json é o default em qualquer API moderna. Frameworks (Express, FastAPI, Spring) têm serialização JSON embutida. CSV em API é exceção rara.
2. Configuração e schema
package.json, tsconfig.json, composer.json,app.json. Hierarquia natural + comentários mentais claros. CSV para config seria impraticável.
3. Dados hierárquicos
Pedido com múltiplos itens, usuário com lista de permissões, produto com variantes, endereço com sub-campos. Qualquer dado que naturalmente se encaixa em árvore.
4. Preservação de tipos entre sistemas
Data como ISO string parseável, booleanos como true/false, números decimais sem truncagem. Em integração sistema-sistema, JSON evita a classe de bugs de conversão.
5. Pequenas trocas de dados
Body de POST/PUT, payload de webhook, mensagem em fila (SQS, Kafka). Em volume pequeno (até alguns KB), JSON é o óbvio.
Casos de uso onde CSV vence
1. Exportação para usuário não-técnico
Gerente quer abrir no Excel. Analista quer importar no Google Sheets. Usuário quer ver tabela em editor de texto simples. CSV ganha por abertura universal.
2. Datasets tabulares grandes
Logs, exports de banco, dados de sensores, pipelines ETL. Milhões de linhas com colunas fixas. CSV 30-50% menor que JSON equivalente + parse mais rápido em ferramentas como Pandas e SQL.
3. Ingestão em banco de dados
Postgres COPY, MySQL LOAD DATA, MongoDB mongoimport — comandos nativos otimizados para CSV. Importar JSON exige conversão prévia ou comandos específicos mais lentos.
4. Análise com planilha, Pandas, R
Ferramentas estatísticas e analíticas consomem CSV diretamente. Para exploratory data analysis, CSV é padrão histórico.
5. Streaming linha-a-linha
Processar bilhões de linhas sem carregar tudo em memória. CSV é inerentemente streamable: uma linha por vez, parse independente. JSON puro exige parse de todo o array antes de acessar primeira entrada (NDJSON contorna isso).
Performance real: benchmarks
Dataset de exemplo: 100.000 linhas × 10 colunas, tipos mistos (4 strings, 3 números, 1 booleano, 1 data, 1 campo hierárquico).
| Critério | JSON | CSV |
|---|---|---|
| Tamanho em bytes | ~14 MB | ~9 MB |
| Tamanho após gzip | ~2,1 MB | ~1,8 MB |
| Serialização em Node.js | ~180 ms | ~320 ms (PapaParse) |
| Parse em Node.js | ~120 ms (JSON.parse nativo) | ~280 ms |
| Serialização em Python | ~140 ms (json) | ~260 ms (csv module) |
| Parse em Python + Pandas | ~220 ms | ~180 ms |
| Ingestão em Postgres | Não nativo | ~15s via COPY |
Contexto
Limitações específicas de cada formato
Limitações do CSV
- Sem tipos: consumidor precisa saber que coluna “ativo” é booleano, qual coluna é data.
- Quebra de linha em campo: aspas duplas necessárias, maioria dos parsers amadores quebra.
- Delimitador ambíguo: vírgula em PT-BR conflita com decimal. Excel BR usa ponto-e-vírgula.
- Encoding: sem BOM, Excel corrompe acentos.
- Sem comentários: não dá pra documentar o arquivo.
- Schema diferente por linha: CSV assume colunas fixas. Linhas com mais/menos colunas quebram.
- Array em célula: serialização custom (separar por vírgula interna, JSON string, etc.).
- Objeto aninhado: exige flatten que pode perder estrutura.
Limitações do JSON
- Overhead: chaves repetidas em cada objeto infla 30-60% em dados tabulares.
- Parse completo: JSON puro exige carregar tudo antes de acessar item (NDJSON resolve).
- Sem suporte a tipos especiais: Date, BigInt, Set, Map — todos viram string ou array.
- Sem comentários: JSON puro não permite comentários (JSON5/JSONC sim, mas não padrão).
- Trailing comma: JSON estrito não permite vírgula após último item.
- Pouco amigável em planilha: usuários não-técnicos não abrem.
NDJSON (JSON Lines): o compromisso
Formato onde cada linha é um objeto JSON válido independente. Une vantagens de CSV (streaming, linha-a-linha) e JSON (tipos, hierarquia).
{"id":1,"nome":"João","valor":1500.50}
{"id":2,"nome":"Maria","valor":890.00}
{"id":3,"nome":"Pedro","valor":1200.00}Extensão .ndjson ou .jsonl. Padrão em logs estruturados (Elastic, Cloudflare, Datadog). Parse linha-a-linha sem carregar tudo. Tipos preservados. Quase todo ferramental moderno suporta.
Parquet: a alternativa para volume grande
Formato colunar com compressão embutida. 5-10x menor que CSV, 10-30x menor que JSON. Preserva tipos. Padrão em ecossistema big data (Spark, DuckDB, Pandas, BigQuery).
| Critério | Tamanho | Parse em Pandas |
|---|---|---|
| CSV | ~1,5 GB | ~45s |
| CSV gzip | ~350 MB | ~55s (descompactando) |
| JSON | ~2,8 GB | ~80s |
| JSON gzip | ~450 MB | ~90s |
| Parquet Snappy | ~180 MB | ~8s |
| Parquet ZSTD | ~130 MB | ~10s |
Vai mais fundo
Conversão JSON → CSV em JavaScript
import Papa from "papaparse";
const data = [
{ id: 1, nome: "João", valor: 1500.50 },
{ id: 2, nome: "Maria", valor: 890.00 },
];
// Conversão simples
const csv = Papa.unparse(data);
// Com BOM para Excel
const csvComBom = "\uFEFF" + csv;
// Download
const blob = new Blob([csvComBom], { type: "text/csv;charset=utf-8" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "dados.csv";
a.click();
URL.revokeObjectURL(url);Conversão CSV → JSON em JavaScript
import Papa from "papaparse";
const csv = `id,nome,valor
1,João,1500.50
2,Maria,890.00`;
const { data, errors } = Papa.parse(csv, {
header: true, // primeira linha vira chave
dynamicTyping: true, // converte números e booleanos automaticamente
skipEmptyLines: true,
});
console.log(data);
// [
// { id: 1, nome: "João", valor: 1500.5 },
// { id: 2, nome: "Maria", valor: 890 },
// ]Conversão em Python
import pandas as pd
# JSON → CSV
df = pd.read_json("dados.json")
df.to_csv("dados.csv", index=False)
# CSV → JSON
df = pd.read_csv("dados.csv")
df.to_json("dados.json", orient="records", force_ascii=False)
# CSV → NDJSON (uma linha por JSON)
df.to_json("dados.ndjson", orient="records", lines=True)Regras práticas para decidir
| Critério | Escolha | Por quê |
|---|---|---|
| API REST / webhook | JSON | Padrão universal, tipos preservados |
| Export para Excel / Sheets | CSV (ou XLSX) | Abertura direta pelo usuário |
| Configuração de app | JSON | Hierárquico, expressivo |
| Data warehouse / ETL | CSV ou Parquet | Performance em massa |
| Log estruturado | NDJSON | Streaming + tipos |
| Dados com hierarquia natural | JSON | Preserva estrutura |
| Dataset > 10M linhas para análise | Parquet | Compressão + colunar |
| Backup simples de banco | CSV | Restaura fácil com COPY/LOAD DATA |
| Troca via e-mail para cliente | CSV ou XLSX | Compatível com tudo |
| Integração entre microserviços | JSON / Protobuf | Tipos + schema |
Convivência: quando ter os dois formatos
Sistemas maduros frequentemente oferecem exportação em ambos formatos. A interface típica em dashboard:
- CSV: para “abrir no Excel” (usuário de negócio).
- JSON: para “integrar com outro sistema” (dev).
- XLSX: quando formatação visual importa (relatório formal).
Arquitetura de pipeline híbrida
Em ETL real, os formatos convivem:
- Coleta (API): fonte retorna JSON.
- Transformação: código parseia JSON, aplica regras de negócio.
- Armazenamento intermediário: NDJSON ou Parquet (streaming, tipado).
- Ingestão em banco: CSV via COPY / LOAD DATA (performance).
- Export para analista: XLSX ou CSV (abre no Excel).
- Integração com sistema externo: JSON via API.
Não é um vence outro — é cada um no seu nicho.
Erros clássicos por formato
Erros em JSON
- Trailing comma:
[{a:1}, ]quebra. - Aspas simples em vez de duplas: JSON estrito exige duplas.
- Date serializada como número: interpretação ambígua no consumidor.
- undefined em propriedade: inválido em JSON; use null.
Erros em CSV
- Delimitador errado: vírgula em PT-BR quebra.
- Sem BOM: acentos quebrados no Excel.
- Aspas internas não escapadas: parser falha.
- Schema inconsistente entre linhas: algumas com 8 colunas, outras com 7.
Alternativas além de JSON e CSV
| Critério | Quando usar |
|---|---|
| NDJSON (JSON Lines) | Logs, streams, tipos preservados + linha-a-linha |
| Parquet | Análise colunar em escala, big data |
| Apache Arrow | In-memory, interop entre Python/R/JS |
| MessagePack | Binário, mais compacto que JSON, mesmo schema |
| Protobuf | Schema forte, performance, RPC |
| YAML | Configuração legível por humanos |
| TOML | Config flat, mais limpa que YAML |
| ORC | Similar ao Parquet, ecossistema Hadoop |
Ferramentas úteis
- Conversor JSON ↔ CSV (MochaLabz): grátis, no navegador, sem envio de dados para servidor.
- Formatador JSON (MochaLabz): valida JSON inválido, formata com indentação correta.
- jq: CLI para transformar JSON (padrão em pipeline Unix).
- csvkit: CLI para transformar CSV (converter, ordenar, agregar).
- Miller (mlr): CLI para transformar ambos formatos.
- DuckDB: consultar CSV / JSON / Parquet com SQL.
JSON vs CSV em uma frase
CSV é para humano com planilha, JSON é para máquina com API. Em 2026, a escolha certa é por audiência e volume: CSV quando usuário final vai abrir no Excel, JSON quando outro sistema vai consumir. Para volumes grandes com análise pesada, Parquet vence os dois. Ambos convivem no mesmo pipeline — cada um no cenário em que ele é o melhor.
Perguntas frequentes
JSON ou CSV — qual é mais eficiente?+
CSV é mais compacto em bytes (sem chaves repetidas por linha), mas JSON comprime melhor com gzip (padrões repetitivos). Para leitura, CSV é mais rápido em linguagens low-level (C, Rust); JSON é mais rápido em linguagens dinâmicas (Python, JS) porque o parsing nativo é otimizado. Para 90% dos casos, a diferença é irrelevante — decida por caso de uso, não por microbenchmark.
CSV suporta tipos de dados?+
Não. CSV é texto plano — tudo é string. Datas, números decimais, booleanos, arrays — todos viram strings no CSV. O consumidor precisa converter de volta. JSON preserva: números são number, booleanos são true/false, arrays são [], objetos são {}. Se preservação de tipo importa (integração entre sistemas, ML pipelines), prefira JSON.
JSON suporta dados hierárquicos; CSV, não — isso é problema?+
Depende. Se seus dados são naturalmente tabulares (lista de pedidos com colunas fixas), CSV é simples e suficiente. Se são hierárquicos (pedido com items aninhados), JSON expressa naturalmente. Forçar JSON em CSV exige flatten (endereco.rua vira coluna); forçar CSV em JSON exige wrapper pra cada linha virar objeto. Use o formato que encaixa no dado.
Qual formato abrir melhor no Excel?+
CSV abre diretamente no Excel (com nuances de encoding e delimitador). JSON não abre nativamente — exige conversão. Para usuário final não-técnico que quer abrir em Excel, prefira CSV (ou XLSX). Para usuário técnico que usa Python/R/SQL, JSON funciona. Em dashboards, oferecer ambas opções é melhor UX: “exportar CSV (planilha)” e “exportar JSON (API)”.
Quando usar Parquet em vez de JSON/CSV?+
Parquet vence em 3 cenários: (1) volumes grandes (milhões de linhas) — compressão 3-10x melhor que CSV; (2) queries analíticas colunares — só lê colunas necessárias; (3) ecossistema big data (Spark, Pandas, DuckDB). Para datasets menores (até 100k linhas) ou troca manual com usuário final, JSON/CSV são mais práticos. Parquet exige biblioteca específica para abrir.
Como converter entre JSON e CSV?+
JavaScript: PapaParse.unparse(array) para JSON→CSV; PapaParse.parse(csv) para CSV→JSON. Python: pd.DataFrame.from_records(data).to_csv() e pd.read_csv().to_dict('records'). Ambos lidam com edge cases (vírgulas em campos, aspas, encoding). Para conversão ad-hoc, ferramenta online (MochaLabz) converte sem código.
JSON tem overhead grande pra listas grandes?+
Sim. Cada objeto carrega as chaves repetidas. Lista de 1M de objetos com 10 campos tem 1M×10 = 10M repetições de nomes. CSV tem as colunas 1x no header e só valores depois. Para dados tabulares enormes, CSV é 2-5x menor. NDJSON (JSON linhas, um objeto por linha) é compromisso: mais streaming-friendly que JSON puro, mas com o mesmo overhead de chaves.
Existe formato que seja “melhor dos dois mundos”?+
Para tabelas com tipos preservados: Parquet ou Arrow. Para streams estruturados: NDJSON (JSON Lines). Para hierárquico com eficiência: MessagePack, BSON, Protobuf. Cada um tem trade-off. Em 2026, o consenso: use JSON para APIs e transporte, CSV para planilha do usuário final, Parquet para análise em escala.
Artigos relacionados
O que é JSON? Guia Completo com Exemplos em 6 Linguagens
JSON é o formato de dados mais usado na web. Aprenda a sintaxe, os 6 tipos de dados, parsing em JavaScript, Python, Go, Java, PHP e Ruby, JSON5/JSONC, erros comuns e boas práticas.
Minificar JSON: Performance Real, Compressão e Quando Vale (2026)
Quando minificar JSON faz diferença real, impacto na performance de APIs, gzip vs brotli vs zstd, alternativas binárias (MessagePack, CBOR, Protobuf) e benchmarks honestos.
Como Converter JSON para CSV em JavaScript (2026): Guia Completo com Código
Guia definitivo de conversão JSON → CSV em JavaScript: abordagens manuais, PapaParse, edge cases com arrays aninhados, encoding UTF-8 com BOM e exemplos prontos em Node.js e browser.
Como Ler CSV em JavaScript (2026): FileReader, Node.js, Streams e PapaParse
Guia completo de leitura de CSV em JavaScript: FileReader no browser, csv-parse e streams no Node.js, PapaParse para grandes volumes, parser RFC 4180 do zero, BOM, encoding e benchmarks.