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.
{"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.
| Caracteristica | JSON | JSONL | NDJSON |
|---|---|---|---|
| Nome Completo | JavaScript Object Notation | JSON Lines | Newline Delimited JSON |
| Extensao de Arquivo | .json | .jsonl | .ndjson |
| Tipo MIME | application/json | application/jsonl (nao oficial) | application/x-ndjson |
| Especificacao | RFC 8259 (padrao IETF) | jsonlines.org (comunidade) | github.com/ndjson/ndjson-spec (comunidade) |
| Delimitador de Linha | N/A (valor unico) | \n (nova linha) | \n (nova linha) |
| Nova Linha Final | N/A | Recomendada | Opcional |
| Adequado para Streaming | Nao (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.
Content-Type: application/x-ndjson# Example: curl a streaming APIcurl -H "Accept: application/x-ndjson" https://api.example.com/events/stream# Example: Express.js responseres.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.
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.
import { createReadStream, writeFileSync } from 'node:fs';import { createInterface } from 'node:readline';// Read NDJSONasync 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 NDJSONconst 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.
# 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 fieldsjq {id, url} data.ndjson# Count total recordsjq -s 'length' data.ndjson# Convert NDJSON to a JSON arrayjq -s '.' data.ndjson > data.json# Convert a JSON array back to NDJSONjq -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.
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 eventslet 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);
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);}// Usagefor 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
Essencialjq 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
CLIndjson-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.jsO 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.
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.