ログやデータセットでは、.jsonlや.ndjsonのように1行ずつ独立したJSONを並べる形式が使われることがあります。テキストエディターでも開けますが、数万行以上になると、壊れた1行や型の混在を目視で探すのは大変です。

Browser KittyのJSONL Viewerは、JSONL / NDJSONをブラウザ内で行単位に走査し、不正JSON・空行、トップレベルフィールドの出現率、観測されたJSON型、レコード内容を確認できます。

JSONL / NDJSONは1行ごとに独立したJSON

通常のJSON配列はファイル全体が1つのJSON値ですが、JSONL / NDJSONは各行が独立したJSONです。たとえば1行目と2行目がそれぞれ正しいJSONでも、ファイル全体を単一JSONとして解析すると失敗することがあります。

JSONL Viewerは.jsonl / .ndjson / .jsonl.txt / .ndjson.txtを行単位で読み取り、正常行と要確認行を分けて表示します。

  • 1行 = 1つのJSONレコード
  • JSONLとNDJSONは同じViewerで確認
  • 通常のJSON配列とは解析方法が異なる

不正JSONや空行を最初に探す

大きなJSONLでは、10万行のうち1行だけ閉じ括弧が欠けている、といった問題が起こります。JSONL Viewerは全体走査後に総行数・正常行・要確認行を表示し、不正JSONや空行を問題として確認できます。

問題行があっても正常なレコードは引き続き閲覧できます。1行のエラーでファイル全体を読めなくするのではなく、問題箇所を切り分けて調査できます。

  • 総行数と要確認行数を先に見る
  • 不正JSONの行へ移動する
  • 空行も意図したものか確認する

フィールドの出現率で欠落を確認する

JSONLでは、すべてのレコードが同じトップレベルフィールドを持つとは限りません。JSONL Viewerは検出したトップレベルフィールドと出現率をまとめるため、必須だと思っていた項目が一部のレコードに存在しない、といった状態を見つけやすくなります。

フィールド自体が存在しない状態と、フィールドは存在して値がnullの状態は別です。出現率と観測型を分けて確認します。

同じフィールドの型混在を確認する

各行が構文的に正しいJSONでも、同じフィールドにnumberとstringが混ざっていると後続処理で問題になることがあります。たとえばpriceが通常は1200のような数値なのに、一部だけ"unknown"という文字列になっているケースです。

JSONL Viewerではトップレベルフィールドについて観測されたJSON型を確認できます。number / string / null、boolean / stringなどの混在を見つけたら、それが意図したデータ設計か確認します。

  • numberとstringの混在
  • nullを欠損値として使っているか
  • trueと"true"を区別する

Table / Record / Cell Inspectorを使い分ける

複数レコードを横並びで比較するときはTable表示、ネストしたオブジェクトや配列を1件ずつ読むときはRecord表示が向いています。長い文字列やセル内で見切れる値はCell Inspectorで全体を確認します。

JSONLの内容を最初から1行ずつ読むのではなく、全体の問題数、フィールド構成、型を確認してから個別レコードへ進むと調査範囲を絞りやすくなります。

大きなファイルは全レコードを保持せずに走査する

JSONL Viewerの全体走査は、単一HTMLに埋め込まれたコードから生成するBlob Workerで行います。初回走査ではすべての解析済みレコードを保持するのではなく、疎なチェックポイントを持ち、ページ移動時に必要な範囲を再読み込みします。

これにより巨大な表を最初からDOMへ並べる方式を避けています。ただし、扱えるファイルサイズは端末メモリ、ブラウザ、ストレージ速度などにも影響されます。

現在ページをJSONL / CSVで取り出す

正常な現在ページのレコードはJSONLとしてコピーできます。また、現在ページをCSVとしてコピーまたは保存できるため、確認した一部だけを表計算ソフトへ渡す用途にも使えます。

これはファイル全体を自動修復したり、全件を一括CSV変換したりする機能ではありません。ネストしたJSONをCSVへ変換する場合も、JSONLとCSVでは表現できる構造が異なる点に注意が必要です。

  • 正常な現在ページをJSONLでコピー
  • 現在ページをCSVでコピー / 保存
  • 全件変換や元ファイル修復ではない

できないこととローカル処理の範囲を確認する

v1.0.0では.jsonl.gz / .ndjson.gz、元ファイルの編集・自動修復、JSON Schema検証、JSONPath、jq相当のクエリには対応していません。ソートも現在ページが対象で、ファイル全体の並べ替えではありません。フィールド統計はトップレベルを対象とします。

選択したファイルはブラウザのFile APIで読み取り、全体走査も端末内のBlob Workerで行います。生成HTMLはconnect-src 'none'を含み、Analytics、Telemetry、外部API、実行時CDNを必要としません。Web版では最初のHTML取得通信だけ発生します。

手順

  1. .jsonl / .ndjson / .jsonl.txt / .ndjson.txtをJSONL Viewerへ追加します。複数ファイルも同時に開けます。
  2. 解析後に総行数・正常行・要確認行を確認し、まず問題の規模を把握します。
  3. 要確認行がある場合は問題一覧から該当ページへ移動し、不正JSONや空行を確認します。
  4. 検出されたトップレベルフィールドと出現率を見て、欠けている項目がないか確認します。
  5. 各フィールドで観測されたJSON型を確認し、number / string / nullなどの混在が意図したものか判断します。
  6. Tableで複数レコードを比較し、ネストしたデータはRecord表示、長い値はCell Inspectorで確認します。
  7. 必要に応じてページを移動し、表示中のページ内でソートして値を確認します。
  8. 必要な正常行をJSONLとしてコピーするか、現在ページをCSVとしてコピー / 保存します。
  9. 問題を修正する場合はViewerではなく元データ生成処理や別の編集手段で直し、修正版をもう一度開いて確認します。
Browser Kittyで試す

JSONL Viewer

JSONL / NDJSONを端末内で走査し、不正行・フィールド出現率・型の混在・レコードを確認します。

ツールを開くツールの詳細を見る

注意点

  • 1行だけ壊れていても残りのJSONLは正常な場合があります。ファイル全体を開ける / 開けないだけで判断しないでください。
  • フィールドが存在しない状態と、値がnullの状態は別なので、出現率と型を分けて見ます。
  • numberとstring、booleanと文字列など、見た目が似ていてもJSON型が違う値に注意してください。
  • 大きなファイルでは端末性能の影響を受けるため、処理中に他の重いタブを閉じると安定する場合があります。
  • Viewerは自動修復をしません。問題行の意味を確認してから元データ側を直す方が安全です。

よくある質問

JSONLファイルは普通のテキストエディターでも開けますか?

開けます。JSONLはテキスト形式です。ただし大きなファイルで不正行、フィールド出現率、型の混在を調べる場合は、JSONL向けViewerの方が確認しやすくなります。

JSONLとNDJSONは両方開けますか?

はい。.jsonl、.ndjson、.jsonl.txt、.ndjson.txtに対応しています。

壊れたJSONが1行あるとファイル全体を見られませんか?

いいえ。不正JSONや空行は要確認として分離し、正常なレコードは引き続き確認できます。

JSONLの型が混在しているか確認できますか?

トップレベルフィールドについて観測されたJSON型を確認できます。number / string / nullなどの混在を把握できます。

JSONLをCSVへ変換できますか?

現在表示しているページをCSVとしてコピーまたは保存できます。ファイル全体を一括CSV変換する機能ではありません。

.jsonl.gzや.ndjson.gzを開けますか?

v1.0.0では対応していません。先にgzipを展開して.jsonlまたは.ndjsonとして開いてください。

不正なJSONを自動修復できますか?

できません。問題行は確認できますが、元JSONL / NDJSONを編集・修復する機能はありません。

JSON Schemaやjqで検証・検索できますか?

v1.0.0ではJSON Schema検証、JSONPath、jq相当のクエリは対象外です。構文上の問題、トップレベルフィールド、観測型などの確認を中心にしています。

JSONLファイルはBrowser Kittyのサーバーへアップロードされますか?

いいえ。選択したファイルはブラウザのFile APIで読み取り、全体走査も端末内のBlob Workerで実行します。Browser Kittyのバックエンドへアップロードして解析する方式ではありません。