Guia Completo NDJSON: JSON Delimitado por Nova Linha Explicado

Um guia abrangente sobre Newline Delimited JSON (NDJSON). Aprenda a especificacao, tipo MIME, como ler e escrever NDJSON em Python, Node.js e linha de comando, usa-lo em APIs HTTP de streaming e entenda sua relacao com JSONL.

Ultima atualizacao: fevereiro de 2026

O que e NDJSON?

NDJSON significa Newline Delimited JSON. E um formato de dados baseado em texto onde cada linha contem exatamente um valor JSON valido, separado por um caractere de nova linha (\n). O formato foi projetado para streaming e processamento de grandes datasets sem carregar o arquivo inteiro na memoria. Diferente de um arquivo JSON padrao que envolve tudo em um unico array ou objeto, NDJSON permite ler, escrever e processar registros um por vez.

A especificacao NDJSON esta hospedada em github.com/ndjson/ndjson-spec. Foi criada para formalizar um padrao que ja havia se tornado comum em envio de logs, pipelines de dados e APIs HTTP de streaming. Cada linha e autocontida: se uma linha contem JSON invalido, outras linhas ainda podem ser parseadas com sucesso. Isso torna o NDJSON tolerante a falhas e adequado para workflows de append-only como logs de aplicacao, streams de eventos e exportacoes incrementais de dados.

Exemplo NDJSON (3 registros)
{"id":1,"event":"page_view","url":"/home"}
{"id":2,"event":"click","url":"/pricing"}
{"id":3,"event":"signup","url":"/register"}

A Especificacao NDJSON

A especificacao oficial do NDJSON em github.com/ndjson/ndjson-spec e intencionalmente minima. Ela define uma convencao simples para serializar multiplos valores JSON em um unico stream de texto. As regras fundamentais sao diretas:

A especificacao evita explicitamente adicionar cabecalhos, metadados ou informacoes de schema ao formato. Isso mantem o NDJSON o mais simples possivel e compativel com ferramentas padrao de processamento de texto Unix. Qualquer valor JSON valido e permitido em cada linha, embora na pratica a maioria dos arquivos NDJSON contenha objetos JSON com um conjunto consistente de chaves.

  • Cada linha DEVE conter exatamente um valor JSON valido (objeto, array, string, numero, booleano ou null).
  • As linhas sao separadas pelo caractere de nova linha '\n' (U+000A). O retorno de carro '\r' (U+000D) pode aparecer antes de '\n', mas nao e obrigatorio.
  • Uma nova linha final apos o ultimo valor JSON e permitida, mas nao obrigatoria.
  • Cada valor JSON nao deve conter caracteres de nova linha nao escapados dentro do proprio valor.

Como as regras sao minimas, NDJSON e facil de gerar a partir de qualquer linguagem de programacao que tenha um serializador JSON. Simplesmente serialize cada registro, adicione uma nova linha e escreva na saida. Sem colchetes de fechamento, sem virgulas finais, sem estrutura de array envolvente para se preocupar.

NDJSON vs JSON vs JSONL

NDJSON, JSON e JSONL cada um tem uma estrutura diferente. JSON padrao codifica um unico valor (geralmente um array ou objeto). JSONL e NDJSON armazenam um valor JSON por linha, e sao funcionalmente identicos entre si. A tabela abaixo destaca as principais diferencas entre os tres formatos.

CaracteristicaJSONJSONLNDJSON
Nome CompletoJavaScript Object NotationJSON LinesNewline Delimited JSON
Extensao de Arquivo.json.jsonl.ndjson
Tipo MIMEapplication/jsonapplication/jsonl (nao oficial)application/x-ndjson
EspecificacaoRFC 8259 (padrao IETF)jsonlines.org (comunidade)github.com/ndjson/ndjson-spec (comunidade)
Delimitador de LinhaN/A (valor unico)\n (nova linha)\n (nova linha)
Nova Linha FinalN/ARecomendadaOpcional
Adequado para StreamingNao (precisa parsear o documento inteiro)Sim (linha por linha)Sim (linha por linha)

Tipo MIME NDJSON: application/x-ndjson

O tipo MIME registrado para NDJSON e application/x-ndjson. Esse content type e usado em cabecalhos HTTP para indicar que o corpo da resposta contem dados JSON delimitados por nova linha. Muitas APIs de streaming, incluindo a API do GitHub, API do Docker Registry e API bulk do Elasticsearch, usam esse tipo MIME para entregar respostas NDJSON.

Cabecalho HTTP Content-Type
Content-Type: application/x-ndjson
# Example: curl a streaming API
curl -H "Accept: application/x-ndjson" https://api.example.com/events/stream
# Example: Express.js response
res.setHeader('Content-Type', 'application/x-ndjson');
res.write(JSON.stringify(record) + '\n');

Algumas APIs tambem aceitam application/json-seq (RFC 7464) ou text/plain como alternativas. No entanto, application/x-ndjson e o tipo MIME mais amplamente adotado para streams JSON delimitados por nova linha. Ao construir uma nova API que transmite registros JSON, use application/x-ndjson para maxima compatibilidade.

Lendo e Escrevendo NDJSON

Trabalhar com NDJSON e direto em qualquer linguagem que suporte JSON. Abaixo estao exemplos praticos para Python, Node.js e linha de comando.

O modulo json integrado do Python lida com NDJSON naturalmente. Leia linhas de um arquivo, parse cada uma com json.loads e escreva com json.dumps. Para arquivos grandes, essa abordagem linha por linha usa memoria constante.

Python: Ler e Escrever NDJSON
guide-ndjson-complete-guide.ndjsonGuide.readWrite.python.code

Em Node.js, use o modulo readline com fs.createReadStream para parsear arquivos NDJSON de forma eficiente. O stream processa uma linha por vez, mantendo o uso de memoria baixo independentemente do tamanho do arquivo.

Node.js: Ler e Escrever NDJSON
import { createReadStream, writeFileSync } from 'node:fs';
import { createInterface } from 'node:readline';
// Read NDJSON
async function readNdjson(filePath) {
const records = [];
const rl = createInterface({
input: createReadStream(filePath, 'utf-8'),
crlfDelay: Infinity,
});
for await (const line of rl) {
const trimmed = line.trim();
if (trimmed) records.push(JSON.parse(trimmed));
}
return records;
}
// Write NDJSON
const data = [
{ id: 1, event: 'page_view' },
{ id: 2, event: 'click' },
];
const ndjson = data.map(r => JSON.stringify(r)).join('\n') + '\n';
writeFileSync('output.ndjson', ndjson, 'utf-8');

A ferramenta de linha de comando jq entende nativamente entrada NDJSON. Use a flag --slurp para coletar todos os registros em um array, ou processe cada registro individualmente sem nenhuma flag.

Linha de Comando: Processar NDJSON com jq
# Print each record (jq reads NDJSON by default)
jq '.' data.ndjson
# Filter records where event is "click"
jq 'select(.event == "click")' data.ndjson
# Extract specific fields
jq {id, url} data.ndjson
# Count total records
jq -s 'length' data.ndjson
# Convert NDJSON to a JSON array
jq -s '.' data.ndjson > data.json
# Convert a JSON array back to NDJSON
jq -c '.[]' data.json > data.ndjson

NDJSON em APIs HTTP de Streaming

NDJSON e o padrao de fato para APIs HTTP de streaming que entregam dados em tempo real. Quando um servidor envia uma resposta NDJSON, o cliente pode comecar a processar o primeiro registro assim que ele chega, sem esperar a resposta inteira ser concluida. Isso e mais rapido e eficiente em memoria do que retornar um grande array JSON.

Servicos populares que usam streaming NDJSON incluem Docker Registry (eventos de camada de imagem), Elasticsearch (operacoes em massa), Apache CouchDB (feed de alteracoes) e muitas APIs modernas orientadas a eventos. O padrao funciona bem com alternativas de Server-Sent Events, tail de logs em tempo real e carregamento progressivo de dados em aplicacoes web.

Servidor de Streaming NDJSON com Express.js
import express from 'express';
const app = express();
app.get('/api/events/stream', (req, res) => {
res.setHeader('Content-Type', 'application/x-ndjson');
res.setHeader('Transfer-Encoding', 'chunked');
// Simulate streaming events
let id = 0;
const interval = setInterval(() => {
id++;
const event = {
id,
type: 'heartbeat',
timestamp: new Date().toISOString(),
};
res.write(JSON.stringify(event) + '\n');
if (id >= 100) {
clearInterval(interval);
res.end();
}
}, 100);
req.on('close', () => clearInterval(interval));
});
app.listen(3000);
Navegador: Consumir Stream NDJSON com Fetch
async function* readNdjsonStream(url) {
const response = await fetch(url, {
headers: { 'Accept': 'application/x-ndjson' },
});
const reader = response.body
.pipeThrough(new TextDecoderStream())
.getReader();
let buffer = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += value;
const lines = buffer.split('\n');
buffer = lines.pop();
for (const line of lines) {
if (line.trim()) yield JSON.parse(line);
}
}
if (buffer.trim()) yield JSON.parse(buffer);
}
// Usage
for await (const event of readNdjsonStream('/api/events/stream')) {
console.log('Received:', event);
}

Ferramentas do Ecossistema NDJSON

Um ecossistema crescente de ferramentas de linha de comando e bibliotecas suporta NDJSON nativamente. Essas ferramentas permitem filtrar, transformar e analisar dados NDJSON sem escrever codigo personalizado.

jq

Essencial

jq e o processador JSON de linha de comando mais popular. Ele le NDJSON por padrao (um valor JSON por linha) e suporta filtragem, mapeamento, agrupamento e reformatacao. Use jq -c para saida compacta e jq -s para agrupar todos os registros em um array.

ndjson-cli

CLI

ndjson-cli e uma colecao de comandos estilo Unix para manipular streams NDJSON: ndjson-filter, ndjson-map, ndjson-reduce, ndjson-sort e ndjson-join. Cada comando le de stdin e escreve em stdout, tornando-os composiveis com pipes.

ndjson (npm)

Node.js

O pacote npm ndjson fornece parsers e serializadores de streaming NDJSON para Node.js. Ele expoe transform streams ndjson.parse() e ndjson.stringify() que se integram diretamente em pipelines de stream Node.js para processamento de dados de alto throughput.

NDJSON e JSONL: Interoperabilidade

NDJSON e JSONL (JSON Lines) sao formatos funcionalmente identicos. Ambos armazenam um valor JSON por linha, separado por caracteres de nova linha. Um arquivo que e NDJSON valido tambem e JSONL valido, e vice-versa. Voce pode renomear um arquivo .ndjson para .jsonl (ou ao contrario) sem alterar um unico byte de conteudo, e toda ferramenta que le um formato lera o outro.

As unicas diferencas sao cosmeticas: NDJSON vem de github.com/ndjson/ndjson-spec e usa a extensao .ndjson com o tipo MIME application/x-ndjson, enquanto JSONL vem de jsonlines.org e usa a extensao .jsonl. Na pratica, a maioria dos desenvolvedores trata os dois nomes como sinonimos. Se seu projeto ja usa JSONL, nao ha necessidade de migrar para NDJSON, e se uma biblioteca diz que suporta NDJSON, ela funcionara com seus arquivos .jsonl sem nenhuma alteracao.

JSONL vs NDJSON: Comparacao Detalhada

Para um mergulho mais profundo na historia, diferencas de especificacao e adocao pela comunidade de JSONL e NDJSON, leia nosso guia de comparacao dedicado.

Experimente Nossas Ferramentas NDJSON/JSONL Gratuitas

Trabalhe com arquivos NDJSON e JSONL diretamente no seu navegador. Todo o processamento acontece localmente, entao seus dados permanecem privados.

Trabalhe com Arquivos NDJSON Online

Visualize, valide e converta arquivos NDJSON e JSONL de ate 1 GB diretamente no seu navegador. Sem uploads necessarios, 100% privado.

Perguntas Frequentes

Guia do Formato NDJSON — Newline Delimited JSON e JSONL E...