piapia123
ja

JSON 構造インスペクター

整形

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

JSON を貼り付けると構造の全体像が出ます:入れ子の深さ、ノード総数、オブジェクトと配列の個数、型の分布、最も長い配列、最も長い文字列。 最も見る価値があるのは重複キーです。 `JSON.parse('{"a":1,"a":2}')` は `{"a":2}` を返し、最初の `a` は何も言わずに消えます。API の現場ではこれが実害になります —— サーバーが同じフィールドを 2 か所に書いていると、「同じ JSON を見ている」2 人が別々の結論に達し、互いに相手の読み違いを疑うことになります。本ツールは元のテキストを走査してそれを見つけ、位置を示します。 「JSON 整形」と別ツールにしている理由:あちらは「この JSON をどう見るか」(整形・折りたたみ・編集)、こちらは「この JSON は何か」(大きさ・深さ・構成)に答えます。入力は同じでも、やることと画面がまったく違います —— ボタンで埋まったエディターに統計を足すのは、どちらにも良くありません。 残る 3 つの操作は再帰的です:シャッフル・反転・重複除去はいずれも全階層の配列に作用し、最上位だけではありません。

機能

  • 入れ子の深さ、ノード総数、オブジェクトと配列の個数
  • 型の分布(string × 12、number × 5 …)を多い順に表示
  • 最も長い配列と、すべての配列の長さ
  • 最も長い文字列の長さと、文字列の総長
  • ⚠️ 重複キー:元のテキストから同一オブジェクト内の重複を探し、位置と回数を示し、JSON.parse が最後の 1 つしか残さないことを説明します
  • シャッフル / 反転 / 重複除去は再帰的に全階層の配列へ適用
  • 重複除去は値の JSON テキストで判定 —— `1` と `"1"` は別物、同じオブジェクト 2 つは同一
  • 解析は「JSON 整形」のエラー位置表示を再利用(行・列付き、Python リテラルも判別)
  • 処理はすべてブラウザ内で完結し、送信しません

使い方

  1. JSON を貼り付けます
  2. 処理は構造統計のままで、各数値がすぐ表示されます
  3. 「重複キー」の行を確認 —— 無い場合も「無し」と明示されます
  4. データを整えるならシャッフル / 反転 / 重複除去を選ぶと、整形済みの JSON が返ります

よくある質問

重複キーの何が問題ですか?コードが読む値は正しく見えます
最後の 1 つを読んでいるからです。JSON.parse は後ろの値を残して前の値を捨て、その捨てる処理は読み取り時ではなく解析時に起きます —— したがって得られる値は「正しい」のですが、想定した出所とは限りません。本当の困りごとは共同作業で起きます:サーバーは A を返したと言い、貼り付けた JSON にも確かに A がある(最初の出現)。しかしコードが受け取るのは後から来た B です。本ツールは両方を指し示すので、同じ箇所を見ながら話せます。
「JSON に重複キーを書いてはいけない」とだけ言えばよいのでは?
仕様が禁止していないからです(RFC 8259 は動作を未定義とし、実装依存としています)。実装ごとに挙動が異なり、JavaScript は最後を残し、Python の json も同様で、厳格なパーサーは文書ごと拒否するものもあります。同じファイルが言語によって違う結果になることこそが危険な点です。本ツールは判断せず、事実だけを示します。
深さはどこから数えますか?
ルートを 1 層目と数えます。`{"a":1}` は 2(ルートのオブジェクト + 数値)、`{"a":{"b":1}}` は 3 です。この数え方だと「ルートから最も深い値までにいくつのノードを通るか」という意味になり、波括弧の数を数えるより直感的です。
シャッフルは暗号学的に安全な乱数ですか?
`Math.random` を使った Fisher–Yates シャッフルです。⚠️ `crypto.getRandomValues` は意図的に使っていません —— 目的はデータの並びを予測できなくすることであり、暗号学的強度ではないからです。予測できない値(パスワード・トークン)が必要なら、パスワード生成か乱数生成のツールを使ってください。

関連ツール