JSON Lines(JSONL)⇔JSON配列 相互変換

1行に1つのJSONオブジェクトを並べるJSON Lines形式と、通常のJSON配列を相互変換します。機械学習データセット・ログ出力の確認に便利です。

使い方のヒント

  • JSON Lines(JSONL)は1行に1つの独立したJSONオブジェクトを並べる形式で、OpenAIのファインチューニング用データセットやElasticsearch/Logstashのログ出力などで標準的に使われています。
  • 「JSONL → JSON配列」モードでは、各行が個別に解析可能なJSONオブジェクトである必要があります。空行は自動的にスキップされます。
  • 「JSON配列 → JSONL」モードでは、入力全体が1つのJSON配列(`[ ... ]`)である必要があります。配列内の各要素が1行ずつのJSONLとして出力されます。
  • 大きなログファイルをJSONLからJSON配列に変換すると、jqコマンドやプログラミング言語の標準的なJSON配列パーサーで扱いやすくなります。

よくある質問

JSON配列は `[ {...}, {...} ]` のように全体を1つの配列として括る形式で、全体をパースしないと個々の要素にアクセスできません。一方JSON Linesは1行に1つの独立したJSONオブジェクトを並べる形式で、1行ずつストリーム処理できるため、巨大なログファイルや機械学習データセットの逐次処理に向いています。

OpenAIやその他の機械学習プラットフォームのファインチューニング用データセット、Elasticsearch・Logstash等のログ収集ツールの出力形式、大量データのストリーミング処理など、1件ずつ独立して読み書きしたい場面で標準的に使われています。

「JSONL → JSON配列」モードでは各行が独立して有効なJSONである必要があり、1行でも構文エラーがあるとその行番号を含むエラーが表示されます。「JSON配列 → JSONL」モードでは入力全体が配列(`[` で始まり `]` で終わる形式)である必要があります。

JSON配列に変換した結果は `jq` コマンドや各種プログラミング言語の標準的なJSONパーサーでそのまま扱えます。逆にJSONLに変換した結果は `jq -c` や `grep`・`awk` 等の行単位処理ツールと相性がよく、ログ解析パイプラインに組み込みやすくなります。
ツールくん

余談ですが ― なぜ「1行1レコード」という形式が生まれたのか

JSON Lines(JSONLとも呼ばれる)という形式が生まれた背景には、通常のJSON配列には「全体をメモリに読み込んでパースし終えるまで、途中経過の1件も取り出せない」という制約があったことが挙げられます。数百万行に及ぶログデータや機械学習の学習データセットをJSON配列で扱おうとすると、ファイル全体をメモリに展開する必要があり、巨大なファイルではメモリ不足やパース時間の増大という問題が生じていました。

JSON Linesは、この問題を「1行=1つの完結したJSONオブジェクト」というシンプルな制約で解決します。ファイルを1行ずつ読み込みながら都度パースできるため、ファイル全体をメモリに読み込む必要がなく、ストリーム処理・並列処理と非常に相性がよいという特性があります。この設計思想は、Unix系OSの伝統的な「1行1レコード」のテキスト処理文化(`grep`・`awk`・`sed` 等のコマンドが行単位で動作すること)とも親和性が高く、既存のコマンドラインツール群にそのまま組み込めるという実用上のメリットも大きいとされています。

現在ではAI・機械学習分野でのデータセット配布形式として広く採用されており、大規模言語モデルの学習データやファインチューニング用のプロンプト・レスポンスのペアなどが、JSON Lines形式で配布されるケースが一般的になっています。