JSONL vs NDJSON: Jaka jest różnica?
Kompletny przewodnik porównujący JSONL (JSON Lines) i NDJSON (Newline Delimited JSON) — dwie nazwy dla niemal tego samego formatu, z subtelnymi różnicami wartymi poznania.
Ostatnia aktualizacja: luty 2026
Szybkie porównanie: JSONL vs NDJSON
| Funkcja | JSONL (JSON Lines) | NDJSON |
|---|---|---|
| Pełna nazwa | JSON Lines | Newline Delimited JSON |
| Rozszerzenie pliku | .jsonl | .ndjson |
| Specyfikacja | jsonlines.org (nieformalna) | github.com/ndjson/ndjson-spec (nieformalna specyfikacja) |
| Pochodzenie | Konwencja społeczności, spopularyzowana przez narzędzia do nauki o danych | Zaproponowana przez Chrisa Olaha, Thorstena Balla i innych |
| Separator linii | \n (znak nowej linii) | \n (znak nowej linii) |
| Typ MIME | application/jsonl (nieoficjalny) | application/x-ndjson |
| Obsługa strumieniowania | Tak, linia po linii | Tak, linia po linii |
| Adopcja | OpenAI, Hugging Face, ekosystem ML/AI | Elasticsearch, Apache Spark, inżynieria danych |
Czym jest JSONL (JSON Lines)?
JSONL, skrót od JSON Lines, to tekstowy format danych, w którym każda linia zawiera pojedynczą prawidłową wartość JSON. Linie są oddzielone znakami nowej linii (\n). Format został spopularyzowany przez społeczności uczenia maszynowego i nauki o danych i jest nieformalnie zdefiniowany na jsonlines.org.
Pliki JSONL używają rozszerzenia .jsonl. Format stał się standardem dla danych treningowych AI i ML — OpenAI wymaga plików .jsonl do dostrajania, a zbiory danych Hugging Face często używają formatu JSON Lines.
{"id": 1, "text": "Hello world", "label": "greeting"}{"id": 2, "text": "How are you?", "label": "question"}{"id": 3, "text": "Goodbye", "label": "farewell"}
Czym jest NDJSON (Newline Delimited JSON)?
NDJSON, czyli Newline Delimited JSON, to format danych, w którym każda linia jest prawidłową wartością JSON oddzieloną znakami nowej linii. Specyfikacja jest hostowana na github.com/ndjson/ndjson-spec i została sformalizowana, aby zapewnić bardziej uporządkowany standard dla danych JSON rozdzielanych liniami.
Pliki NDJSON używają rozszerzenia .ndjson i mają zarejestrowany typ MIME application/x-ndjson. Format jest szeroko stosowany w inżynierii danych, przetwarzaniu logów i aplikacjach strumieniowych — Elasticsearch, Apache Spark i wiele HTTP streaming API używa NDJSON.
{"id": 1, "text": "Hello world", "label": "greeting"}{"id": 2, "text": "How are you?", "label": "question"}{"id": 3, "text": "Goodbye", "label": "farewell"}
Czy JSONL i NDJSON to ten sam format?
W praktyce tak — JSONL i NDJSON są funkcjonalnie identycznymi formatami. Oba przechowują jedną wartość JSON na linię, oddzieloną znakami nowej linii (\n). Plik .jsonl i plik .ndjson z tymi samymi danymi są całkowicie wymienne, a każde narzędzie, które odczytuje jeden format, może odczytać drugi.
Różnice dotyczą wyłącznie nazewnictwa, adopcji społeczności i konwencji metadanych. JSONL (JSON Lines) wyłoniło się ze społeczności nauki o danych i uczenia maszynowego, podczas gdy NDJSON (Newline Delimited JSON) zostało sformalizowane przez społeczność inżynierii danych i strumieniowania internetowego. Pomyśl o tym jak o "film" vs "kino" — to samo, różne preferencje nazw w różnych kręgach.
Najbardziej znacząca różnica to rozszerzenie pliku (.jsonl vs .ndjson) i typ MIME. NDJSON ma bardziej powszechnie rozpoznawany typ MIME (application/x-ndjson), który jest używany w kontekstach strumieniowania HTTP, podczas gdy pliki JSONL są standardem w przepływach pracy AI/ML. Wybierając między nimi, kieruj się konwencją swojego ekosystemu.
Kluczowe różnice między JSONL i NDJSON
1. Specyfikacja i autorytet
Zdefiniowane na jsonlines.org ze zwięzłą, nieformalną specyfikacją. Specyfikacja jest prosta: każda linia to prawidłowa wartość JSON, linie są oddzielone '\n', a zalecane jest kodowanie UTF-8.
Zdefiniowane na github.com/ndjson/ndjson-spec z nieco bardziej formalną specyfikacją. NDJSON wyraźnie wymaga, aby każda linia była prawidłową wartością JSON i aby separator linii był '\n' (nie '\r\n'), z zalecanym końcowym znakiem nowej linii.
2. Rozszerzenie pliku
Używa rozszerzenia .jsonl. To jest standard dla plików do dostrajania OpenAI, zbiorów danych Hugging Face i większości narzędzi ML/AI. GitHub i VS Code rozpoznają pliki .jsonl z podświetlaniem składni.
Używa rozszerzenia .ndjson. Jest to powszechne w narzędziach inżynierii danych, API zbiorczych Elasticsearch i strumieniowych odpowiedziach HTTP. Wiele edytorów obsługuje również podświetlanie składni .ndjson.
3. Typ MIME
Brak oficjalnie zarejestrowanego typu MIME. Typowe nieoficjalne typy to application/jsonl i application/json-lines. W praktyce wiele systemów używa application/jsonl lub wraca do application/json.
Używa application/x-ndjson jako typu MIME. Jest bardziej powszechnie rozpoznawany w kontekstach HTTP i jest używany przez Elasticsearch, standard strumieniowania Fetch API i różne frameworki internetowe dla odpowiedzi strumieniowych.
4. Adopcja społeczności i ekosystemu
Dominujący w ekosystemie AI/ML. OpenAI, Anthropic, Google Gemini, Hugging Face i większość frameworków ML używa .jsonl. Termin 'JSONL' jest częściej wyszukiwany i rozpoznawany w społeczności programistów ogólnie.
Preferowany w inżynierii danych i systemach backendowych. Elasticsearch, Apache Spark, PostgreSQL COPY i wiele narzędzi do agregacji logów używa NDJSON. Pakiet npm ndjson ma miliony pobrań tygodniowo.
Kiedy używać JSONL vs NDJSON
- Przygotowujesz dane treningowe dla OpenAI, Anthropic lub innych platform dostrajania LLM
- Pracujesz ze zbiorami danych Hugging Face
- Budujesz potoki ML i preprocessingu danych
- Twój zespół lub dokumentacja odnosi się do 'JSON Lines'
- Przesyłasz pliki na platformy AI/ML, które oczekują rozszerzenia .jsonl
- Pracujesz w środowiskach nauki o danych Python
- Strumieniujesz dane JSON przez HTTP (Server-Sent Events, fetch streaming)
- Pracujesz z API zbiorczym Elasticsearch
- Budujesz potoki danych z Apache Spark lub podobnymi narzędziami
- Ustawiasz nagłówki Content-Type (application/x-ndjson)
- Twoja infrastruktura lub zespół używa konwencji NDJSON
- Pracujesz z bibliotekami strumieniowymi Node.js
Przykłady kodu: Odczyt JSONL i NDJSON
# Odczyt JSONL - dokładnie tak samo jak odczyt NDJSONimport jsonwith open('data.jsonl', 'r') as f:for line in f:record = json.loads(line.strip())print(record['text'])# Wyjście:# Hello world# How are you?# Goodbye
// Odczyt NDJSON - dokładnie tak samo jak odczyt JSONLimport { createReadStream } from 'fs';import { createInterface } from 'readline';const rl = createInterface({input: createReadStream('data.ndjson')});for await (const line of rl) {const record = JSON.parse(line);console.log(record.text);}// Wyjście:// Hello world// How are you?// Goodbye