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

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

JSON Lines(JSONL)とは

JSON Lines は1行に1つの JSON オブジェクトを書き並べた形式です。ファイル全体としては JSON ではないため、末尾にカンマが要らず、行を追記するだけでデータを足せます。ログの出力、機械学習の学習データ、BigQuery や Elasticsearch への一括取り込みなど、「1件ずつ流す」用途で広く使われています。拡張子は `.jsonl` や `.ndjson` が一般的です。

このツールは JSON Lines と JSON 配列を相互に変換します。JSONL から配列への変換では空行を読み飛ばし、どこかの行が JSON として壊れていればその旨をエラーで知らせます。配列から JSONL への変換では、トップレベルが配列でない場合にエラーになります。処理はすべてブラウザー内で完結するため、ログや学習データのような外に出したくない内容でも安心して扱えます。

JSONL と JSON 配列を変換する手順

  1. 変換の向きを選ぶ JSONL から JSON 配列へ、または JSON 配列から JSONL へを選びます。
  2. データを貼り付ける JSONL なら1行1オブジェクト、JSON 配列なら `[` で始まるテキストをそのまま入れます。
  3. エラーが出たら行を確認する どの行が JSON として解釈できなかったかが示されます。末尾のカンマや引用符の閉じ忘れが典型的な原因です。
  4. 結果をコピーする 変換結果をそのままファイルへ保存したり、次のツールへ渡したりできます。

使いこなすためのヒント

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

こんなときに使えます

ログを解析ツールに読ませる

1行1レコードで出力されたアプリケーションログを JSON 配列にまとめると、配列前提のツールやライブラリでそのまま扱えます。

機械学習の学習データを整える

学習データは JSONL で配布されることが多い一方、前処理スクリプトは配列を期待することがあります。その橋渡しに使えます。

BigQuery や Elasticsearch へ取り込む

これらは改行区切りの JSON を入力形式として受け付けます。手元の JSON 配列を取り込める形に変換できます。

大きな JSON を行単位で扱えるようにする

配列のままだと全体を読み込むまで処理を始められませんが、JSONL にすれば1行ずつ順に処理できます。

JSON Lines の用語

JSON Lines(JSONL)
1行に1つの JSON 値を書く形式です。**ファイル全体は JSON として妥当ではありません**(複数の値が並ぶため)。1行ずつが独立して読めることが利点です。
NDJSON
Newline Delimited JSON の略で、JSON Lines とほぼ同じものを指します。拡張子 `.ndjson` もこの呼び方に由来します。
ストリーム処理
データ全体を読み込まずに、届いた先頭から順に処理していく方式です。JSONL が向いているのはこの方式と相性が良いためです。
トップレベル
JSON の最も外側にある値です。配列から JSONL へ変換する場合、ここが配列 `[...]` である必要があります。オブジェクト `{...}` のままでは変換できません。
空行の扱い
JSONL の仕様上、空行は意味を持ちません。本ツールは空行を読み飛ばすため、行末の余分な改行があっても変換できます。

よくある質問

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形式で配布されるケースが一般的になっています。