ログ、イベントストリーム、データエクスポート、AI データセットが 1 つの整った JSON ドキュメントを超える規模になると、JSONL が登場します。各行が 1 つの完全な JSON 値なので、追記、分割、ストリーミング、レコード単位の処理がしやすくなります。

ZeroTool JSONL コンバーターを開く →

このガイドでは、JSONL、NDJSON、双方向変換、行単位の検証、コマンドラインでの同等操作、壊れたデータファイルを作る典型的な原因を扱います。

クイック回答

タスク最適な方法
JSONL を通常の JSON に変換各行を解析し、レコードを JSON 配列で包む。
JSON 配列を JSONL に変換各配列アイテムをコンパクトな JSON.stringify() でシリアライズし、1 アイテム 1 行にする。
JSONL ファイルを検証各行を独立して解析し、失敗した行番号を報告する。
乱れたファイルから一部データを出力有効な行だけ変換し、報告されたエラー行を確認する。

ブラウザで素早く確認するなら JSONL コンバーター を使います。繰り返し使うシェルスクリプトには jq が向いています。

JSONL とは

JSONL は JSON Lines の略です。NDJSON は newline-delimited JSON を意味します。日常の開発では、どちらも実用上は同じ形を指します。

{"id":1,"event":"signup","user":"alice"}
{"id":2,"event":"purchase","user":"bob","amount":29.99}
{"id":3,"event":"cancel","user":"carol"}

各行は単体で有効な JSON です。ファイル全体は、改行で区切られた JSON 値の並びです。この形は次の用途に適しています。

  • 発生したイベントを追記するアプリケーションログ
  • 各行が構造化レコードである分析エクスポート
  • 検索インデックス作成パイプライン
  • 機械学習と AI トレーニングデータセット
  • レコードが 1 件ずつ届くストリーミング API

JSON 配列はレコードを 1 つのドキュメントにまとめます。JSONL は各レコードを独立した行として保存します。この行指向の構造が、ストリーミング処理やコマンドラインツールと相性のよい理由です。

JSONL を JSON 配列に変換する

ブラウザ上の変換ロジックはシンプルです。

const jsonl = `{"id":1,"event":"signup"}
{"id":2,"event":"purchase"}`;

const array = jsonl
  .split("\n")
  .filter((line) => line.trim())
  .map((line) => JSON.parse(line));

console.log(JSON.stringify(array, null, 2));

出力:

[
  {
    "id": 1,
    "event": "signup"
  },
  {
    "id": 2,
    "event": "purchase"
  }
]

ZeroTool コンバーターは、この処理に安全なワークフローを加えています。総行数、有効行、空行、解析エラーを追跡します。行の解析に失敗すると、問題パネルに行番号、パーサーメッセージ、元の行の短いプレビューが表示されます。

JSON 配列を JSONL に変換する

配列から始めます。

[
  { "id": 1, "event": "signup" },
  { "id": 2, "event": "purchase" }
]

各アイテムを 1 行のコンパクトな JSON 文字列にします。

const jsonl = array.map((item) => JSON.stringify(item)).join("\n");

出力:

{"id":1,"event":"signup"}
{"id":2,"event":"purchase"}

コンパクト出力は重要です。各行が 1 つの完全なレコードである必要があります。オブジェクトを複数行に整形すると、1 レコードが複数の断片に分かれます。

行単位のエラーを検証する

JSONL の失敗は多くの場合、局所的です。大きなファイルの中に 1 行だけ壊れた行があり、周囲のレコードは正常というケースがあります。

{"id":1,"event":"signup"}
{"id":2,"event":"purchase",}
{"id":3,"event":"cancel"}

2 行目には末尾カンマがあります。行単位の検証器なら 2 行目 をすぐに報告できます。通常の JSON フォーマッターでは、ファイル全体が解析失敗のドキュメントとして扱われます。

実用的な検証項目:

  • 空行以外の各行を独立して解析する
  • 空行を別に数える
  • 失敗した行の短いプレビューを保持する
  • レビュー後に解析成功済みの有効レコードを出力する
  • 有効レコードの元の順序を保つ

コマンドラインでの同等操作

jq で JSON 配列を JSONL に変換:

jq -c '.[]' data.json > data.jsonl

JSONL を JSON 配列に戻す:

jq -s '.' data.jsonl > data.json

JSONL ファイルを行ごとに検証:

awk '{ print NR ":" $0 }' data.jsonl | while IFS=: read -r line value; do
  echo "$value" | jq empty >/dev/null 2>&1 || echo "Invalid JSON on line $line"
done

ブラウザツールは単発の確認に向いています。シェル版は CI ジョブや繰り返し使うインポートパイプラインに向いています。

ベストプラクティス

実践効果
1 行 1 レコードを保つストリーミングツールがレコードを独立して処理できます。
各レコードをコンパクト JSON にする複数行に整形されたオブジェクトは行区切り形式を壊します。
UTF-8 テキストで保存するエディタ、ターミナル、API 間で扱いやすくなります。
インポート前に検証するデータベースやモデル学習ジョブに入る前にエラー行を発見できます。
安定したキーを維持する下流の CSV、SQL、schema ツールが使いやすくなります。

変換後は、JSON 配列を JSON フォーマッター で確認し、JSON to CSV コンバーター で表計算ワークフローへ渡し、JSON Diff で 2 つのエクスポートを比較できます。