JSON vs JSONL: 違いは?
JSONとJSONL(JSON Lines)形式、その違い、それぞれの使い時を理解するための完全ガイド。
最終更新:2026年2月
クイック比較
| 特徴 | JSON | JSONL (JSON Lines) |
|---|---|---|
| 構造 | 単一のオブジェクトまたは配列 | 1行に1つのJSONオブジェクト |
| ファイル拡張子 | .json | .jsonl または .ndjson |
| パース | ファイル全体をパース必要 | 行ごとにパース可能 |
| ストリーミング | 困難 | ネイティブサポート |
| 大ファイル処理 | メモリ集約型 | メモリ効率的 |
| 可読性 | インデントでフォーマット | コンパクト、1行1レコード |
| Schema検証 | JSON Schema対応 | 行ごとのJSON Schema |
| データ追加 | ファイル全体の書き換えが必要 | 新しい行を追加するだけ |
JSONとは?
JSON(JavaScript Object Notation)は、人間にとって読み書きが容易で、機械にとって解析と生成が容易な軽量データ交換フォーマットです。JavaScriptのサブセットに基づいており、Web上のデータ交換の事実上の標準となっています。
JSONファイルは単一のJSON値(通常はオブジェクトまたは配列)を含みます。データにアクセスするには、ファイル全体を1つのユニットとしてパースする必要があります。
[
{"name": "Alice", "age": 30, "city": "New York"},
{"name": "Bob", "age": 25, "city": "London"},
{"name": "Charlie", "age": 35, "city": "Tokyo"}
]JSONL(JSON Lines)とは?
JSONL(JSON Lines)は、Newline Delimited JSON(NDJSON)とも呼ばれ、各行が有効なJSONオブジェクトであるテキスト形式です。行は改行文字(\n)で区切られます。標準JSONと異なり、データを囲む配列やオブジェクトはありません。
JSONLファイルの各行は独立しており、個別にパースできます。これにより、JSONLはストリーミングデータ、ログファイル、大規模データセットの処理に最適です。
{"name": "Alice", "age": 30, "city": "New York"}
{"name": "Bob", "age": 25, "city": "London"}
{"name": "Charlie", "age": 35, "city": "Tokyo"}JSONとJSONLの主な違い
1. ファイル形式と構造
JSONはすべてのデータを単一のオブジェクトまたは配列で囲みます。ファイル全体が構文的に正しい必要があります。
JSONLは1行に1つのJSONオブジェクトを格納。各行は独立しており、1行にエラーがあっても他の行はパース可能です。
2. パースとメモリ使用量
JSONはファイル全体を一度に読み込みパースする必要があります。1GBのJSONファイルのパースには約1GB+のメモリが必要です。
JSONLは行ごとに読み取りパースできます(ストリーミング)。10GBのJSONLファイルでも、1行ずつ読むことで最小限のメモリで処理できます。
3. ストリーミングとリアルタイムデータ
JSONはストリーミング向けに設計されていません。ファイル全体の受信とパースが完了するまでデータ処理を開始できません。
JSONLはストリーミングに最適です。各行は受信次第処理でき、リアルタイムデータフィード、ログ、SSEに最適です。
4. データの追加と書き込み
JSON配列へのデータ追加には、ファイル全体の読み取り、パース、新要素の追加、ファイル全体の書き換えが必要です。
JSONLファイルへの追加は、末尾に新しい行を加えるだけです。既存データの読み取りや変更は不要。O(1) vs JSONのO(n)です。
5. 可読性
JSONはインデントによるフォーマットをサポートし、設定ファイルやAPIレスポンスの可読性に優れています。
JSONLは設計上コンパクトで、1行1レコードです。機械処理に最適化されていますが、個別の行はフォーマット可能です。
JSON vs JSONLの使い分け
- 設定ファイル
- REST APIのリクエスト/レスポンスボディ
- 小規模な構造化データ(10MB未満)
- データの可読性と編集性が必要
- ネストされた階層的データ構造
- ブラウザ側のデータ交換
- 大規模データセットの処理(100MB+)
- リアルタイムデータストリーミング
- ログファイルとイベントデータの書き込み
- 機械学習モデルのトレーニング(OpenAI、Hugging Face)
- ETLパイプラインとデータ処理
- 頻繁なデータ追加
- Unixツールでのデータ処理(grep、awk、sed)
一般的なユースケース
機械学習とAI
JSONLJSONLはMLトレーニングデータの標準形式です。OpenAIはファインチューニングデータセットにJSONLを使用し、多くのMLフレームワークはJSONL入力を期待します。
アプリケーションロギング
JSONLサーバーログ、アプリケーションイベント、監査証跡はJSONLに自然に適しています。各イベントは1行として書き込まれ、追加、grep検索、ストリーミングツールでの処理が容易です。
Web APIと設定
JSONREST APIは通常、リクエストとレスポンスボディにJSONを使用します。設定ファイル(.json)はネストされたオブジェクトを持つ可読な構造化設定にJSONを使用します。
ビッグデータと分析
JSONLデータパイプライン、ETLプロセス、分析ツールはJSONLを使用して大量のデータを処理します。各レコードを独立して処理でき、並列処理とMapReduceパターンが可能です。
コード例
// JSON読み取り - ファイル全体のロードが必要
const data = JSON.parse(fs.readFileSync('data.json', 'utf8'));
// データアクセス
data.forEach(item => {
console.log(item.name);
});// JSONL読み取り - 行ごとにストリーム
import { createReadStream } from 'fs';
import { createInterface } from 'readline';
const rl = createInterface({
input: createReadStream('data.jsonl')
});
for await (const line of rl) {
const item = JSON.parse(line);
console.log(item.name);
}// JSON配列をJSONLに
const jsonArray = JSON.parse(fs.readFileSync('data.json', 'utf8'));
const jsonl = jsonArray
.map(item => JSON.stringify(item))
.join('\n');
fs.writeFileSync('data.jsonl', jsonl);// JSONLをJSON配列に
const lines = fs.readFileSync('data.jsonl', 'utf8')
.split('\n')
.filter(line => line.trim());
const jsonArray = lines.map(line => JSON.parse(line));
fs.writeFileSync('data.json', JSON.stringify(jsonArray, null, 2));