JSON 整形

JSON 整形ツールです。インデント (半角 2 つ・4 つ・タブ・圧縮) を選んで見やすく組み直し、壊れた JSON は行・列・理由を日本語で出します。数は書かれた文字のまま変えず、生成 AI が出した JSON (コードフェンスや前後の説明文つき) も直せます。値はこのブラウザの中でだけ処理し、どこにも送りません。登録は要りません。

文 ゆめさく公開 更新

0 文字

整形した結果

左に JSON を入力すると、ここに整形した結果が出ます。

使い方

  1. 左の欄に JSON を貼り付けるか、サンプルのボタンで読み込みます。
  2. インデント (半角 2 つ・4 つ・タブ・圧縮) を選びます。必要なら「キーを辞書順に並べ替える」も付けます。
  3. 構文が壊れているときは、行・列・理由が出ます。よくある壊れ方なら「よくある誤りを直す」、ChatGPT や Claude が出した JSON なら「生成AIのJSONを直す」を付けます。
  4. 「コピーする」か「ダウンロードする」で、整形した結果を取り出します。

構文エラーの行・列を自前の構文解析で出すしくみ

JSON.parse は、文法に合わない文字列を渡すと例外を投げます。Node 24 (V8 13.6) で確かめたところ、いまはExpected double-quoted property name in JSON at position 7 (line 1 column 8)のように行・列まで文言に含まれます。ただし文言は英語でエンジンごとに違い、すべての実装が行・列を返すとは限りません。

この道具は、ブラウザや Node の実装に頼らず、JSON の文法を定めたRFC 8259に沿った構文解析を自分で書いています。1 文字ずつ読み進めながら行番号と桁番号を数えているので、どの環境で開いても同じ日本語の行・列・理由が出ます。桁はコードポイント単位で数えるので、絵文字のような 2 つの符号単位からなる文字も 1 文字として数えます。全角スペースや全角引用符のように見た目が紛らわしい記号も、名指しで案内します。

よく出る壊れ方と、出している理由

よくある構文エラーと、この道具が出す理由
壊れ方この道具が出す理由
末尾の余分なカンマ最後のメンバーのあとに余分なカンマがあります。JSON は末尾のカンマを許しません。
文字列をシングルクォートで囲む文字列はダブルクォート (") で囲んでください。シングルクォート (') は JSON で使えません。
キーにダブルクォートが無いオブジェクトのキーはダブルクォートで囲んだ文字列にしてください。
// や /* */ のコメントJSON にはコメントの構文がありません。
数の先頭の余分な 00 で始まる数のすぐあとに数字は置けません。
NaN、Infinity、-Infinity、undefinedJSON の値ではありません。

「よくある誤りを直して整形」が直す範囲

上の表の最初の 4 つ (末尾のカンマ、シングルクォート、キーの引用なし、コメント) だけを読み替えて整形します。キーのあとの : が無い、値の区切りの , が無いといった、読み手にも正解が分からない壊れ方は直さず、同じ行・列・理由を出します。直した箇所は、すべて位置つきの一覧で見えます。

数を書かれた文字のまま出すしくみ

多くの整形ツールは、数をいったん JSON.parse で JavaScript の数 (64 ビットの浮動小数点数) にしてから書き戻します。この方法では、18 桁の整数が丸まる、1e400 のような大きさの数が null になる、-0 が 0 になる、といった変化が黙って起きます。

数の変化の例 (JSON.parse と JSON.stringify だけで整形したとき)
入力JSON.parse → JSON.stringify の結果この道具の結果
1e400null1e400 (そのまま)
123456789012345678901234567890123456700012345678901234567890 (そのまま)
-00-0 (そのまま)

この道具は、数を書かれた文字 (raw) のまま内部に持ち、整形・圧縮でもその文字をそのまま書き出します。JSON.stringify は使っていません。RFC 8259 の 6 節は、安全に相互運用できる整数の範囲を -(2^53)+1 から (2^53)-1 までとし、1E400 のような数は相互運用の問題を示唆すると書いています。API の ID (64 ビット整数が多い) を整形して黙って別の ID になるのは、この種の道具で一番起きやすい壊れ方です。

インデント・圧縮・キーの並べ替え

整形 (半角スペース 2 つ・4 つ・タブ) と圧縮 (1 行に詰める) は、どちらも自前の書き出しで行います。文字列のエスケープは標準の規則に合わせていますが、数は上で説明した通り書かれた文字のまま出すので、ブラウザの JSON.stringify とは数の扱いが違います。

「キーを辞書順に並べ替える」を付けると、オブジェクトのキーだけを並べ替えます。配列の要素は、順番自体に意味のあるデータなので並べ替えません。2 つの JSON を見比べて差分を探すときや、提出物のキー順をそろえたいときに使います。並べ替えを切っている間は、書いた順のまま出します (下の FAQ を参照)。

JSON の値の型

JSON の値として書けるのは次の 6 種類です。JavaScript でよく使う undefined や NaN、関数、Date のオブジェクトは JSON の値ではありません。

JSON で使える型と、使えない型
使える型書き方の例
文字列"text"
数123、-0.5、1e10
真偽値true、false
nullnull
配列[1, 2, 3]
オブジェクト{"key": "value"}

使えない物の代表は、undefined、NaN、Infinity、-Infinity、関数、Date のオブジェクトです。JavaScript の JSON.stringify は、オブジェクトの中の undefined・関数のキーを黙って取り除き、NaN・Infinity は null に変えますが、Date だけは取り除かれず toJSON() で ISO 形式の文字列 (例 "2024-⁠01-⁠01T00:00:00.000Z") に変わります。どれも JSON の文字列として直接書くとエラーになります。「生成AIのJSONを直す」を付けると、NaN・Infinity・undefined だけは null に読み替えます。

生成 AI が出した JSON を直す

ChatGPT や Claude に JSON を作らせると、```json のようなコードフェンスで囲ったり、前後に「こちらが結果です」のような説明文を付けたりすることがよくあります。また、JavaScript 寄りの書き方として NaN や undefined を値に書いてしまうこともあります。「生成AIのJSONを直す」は、これらをまとめて直します。

  • コードフェンス (``` や ```json) を、前に説明文があっても探して取り除きます。
  • JSON の前後に残った説明文は、最初に出てくる { か [ から、対応する最後の } か ] までを中身とみなして取り除きます。
  • NaN、Infinity、-Infinity、undefined は null に読み替えます。
  • 末尾のカンマ、シングルクォート、キーの引用なし、コメントも「よくある誤りを直す」と同じく直します。

読み飛ばした範囲は文字列を切り詰めず、位置だけをずらして読んでいるので、残った中身にエラーがあれば、貼り付けた元の文のままの行・列で案内します。何を読み飛ばしたか、何を置き換えたかは「直した箇所」の一覧で確かめられます。AI を使ったコーディングそのものを学びたい人は、下の関係する道具とレッスンの AI コーディングの頁を見てください。

値はブラウザの中だけで処理するしくみ

貼り付けた JSON は、このブラウザの中だけで構文解析・整形し、サーバーへの送信も保存もしません。ページを閉じれば入力は消えます。

通信が出ないことの確かめ方

ブラウザの開発者ツールで Network の画面を開き、JSON を貼り付けたり、インデントやキーの並べ替えのボタンを押したりしてください。押しても通信の行が増えないことが分かります。サイト全体のアクセス計測の通信が別に出ることはありますが、貼り付けた JSON の中身は含まれません。

大きな入力 (2,000,000 文字超) と、深すぎる入れ子 (500 階層超) を断る理由

2,000,000 文字を超える入力は、1 文字も解析せずに断ります。手元の計測では、上限いっぱいの 2,000,000 文字 (オブジェクトと配列が合わせて 5 万個ほど) でも構文解析は 1 秒未満で終わりますが、貼り付けの手間や、タブを切り替える操作が重くなるのを避けるための上限です。

配列やオブジェクトの入れ子が 500 階層を超える入力も、それ以上は読まずに断ります。この道具の構文解析は、入れ子が 1 段深くなるたびに関数の呼び出しを 1 段重ねる作りなので、歯止めが無いと壊れた JSON や極端に深い JSON でブラウザの呼び出しスタックを使い切り、道具ごと落ちる恐れがあります。断ったときは、他のエラーと同じように理由を日本語で出します。

別の場所で整形するなら

普段使っているエディタやコマンドラインで整形したいときの方法です。

VS Code

VS Code の公式ドキュメントには、ファイル全体を整形する Format Document の既定のキー割り当てが、OS ごとに Windows は Shift+Alt+F、macOS は ⇧⌥F (Shift+Option+F)、Linux は Ctrl+Shift+I と書かれています。コマンドパレット (F1 または Ctrl+Shift+P、Mac は Cmd+Shift+P) から Format Document を検索して実行する方法なら、キー割り当てを覚えていなくても使えます。VS Code は JSON 用の整形を標準で持っています。

jq (コマンドライン)

jq が入っていれば、次のように整形できます。数の書き方は変わることがあります (1e400 は 1E+400 に) が、値そのものは変えません。

terminal

cat data.json | jq .

python -m json.tool (コマンドライン)

Python が入っていれば、追加のインストールなしで整形できます。ただし 1e400 のような大きすぎる数は JSON にない Infinity に、-0 は 0 に変わります (大きな整数はそのまま保たれます)。数を変えたくないときは、この頁の道具を使ってください。

terminal

python -m json.tool data.json

コードで書くなら

同じ整形を自分のコードに入れたいときの例です。どちらも標準ライブラリの JSON の読み書きだけで、追加のライブラリは要りません。

Python の例

format_json.py

import json

text = '{"name": "yumesaku", "active": true, "tags": ["json", "format"]}'

data = json.loads(text)
print(json.dumps(data, ensure_ascii=False, indent=2))

実行すると、次のように出ます。

出力の例

{
  "name": "yumesaku",
  "active": true,
  "tags": [
    "json",
    "format"
  ]
}

Python の json モジュールは、壊れた JSON を読んだときに投げるjson.JSONDecodeError が、読めなかった位置を行番号 (lineno) と列番号 (colno) として持っています。この道具の「行・列を自前で出す」考え方と同じです。下の出力は Python 3.13 以降 (手元では 3.14.7 で確認) のもので、3.11・3.12 では文言が Expecting property name enclosed in double quotes に変わります。

json_error.py

import json

try:
    json.loads('{"a": 1,}')
except json.JSONDecodeError as e:
    print(e.lineno, e.colno, e.msg)

出力の例 (Python 3.13 以降)

1 8 Illegal trailing comma before end of object

JavaScript の例

format-json.mjs

const text = `{"name":"yumesaku","active":true,"tags":["json","format"]}`;

const data = JSON.parse(text);
console.log(JSON.stringify(data, null, 2));

実行すると、次のように出ます。ブラウザと Node.js のどちらでも動きます。

出力の例

{
  "name": "yumesaku",
  "active": true,
  "tags": [
    "json",
    "format"
  ]
}

API を呼んで JSON を受け取るところまで含めて学びたい人は、下の関係する道具とレッスンに並べた JavaScript の非同期処理のコース (全 19 レッスン・380 分、2026-⁠10-⁠26 時点で本番を確認) を見てください。

よくある質問

JSON整形ツールとは何ですか

JSON の文字列を、読みやすいインデント付きの形に組み直したり、逆に空白を省いた 1 行に圧縮したりする道具です。API のレスポンスや設定ファイルのように、改行の無い 1 行で返ってきた JSON を人が読める形にしたいときに使います。入力はこのブラウザの中だけで処理し、どこにも送りません。

構文エラーの位置が、ブラウザによって違うと聞きました。本当ですか

文言は本当に違いますが、「行・列を教えない」という意味では、いまは当たりません。Node 24 (V8 13.6) の JSON.parse は Expected double-⁠quoted property name in JSON at position 7 (line 1 column 8) のように行・列を返します。ただし文言は英語でエンジンごとに違い、すべての実装が行・列を返すとは限りません。この道具は RFC 8259 の文法に沿った構文解析を自前で書いているので、どの環境で開いても同じ日本語の行・列・理由が出ます。全角スペースや全角引用符のような見た目が紛らわしい記号も、名指しで案内します。

インデントは 2 つと 4 つ、タブのどれがよいですか

好みと、貼り付け先の決まりに合わせてください。半角スペース 2 つは Web 系 (JavaScript、JSON そのもの) でよく使われ、画面の横幅を取りにくい分だけ多くの行を見渡せます。半角スペース 4 つは Python 系で好まれ、入れ子が深い段で読み違えにくい分だけ横に伸びます。タブは、閲覧側の設定でインデント幅を変えられるので、幅の好みが分かれるチームに向きます。

圧縮 (1 行に) は、どんなときに使いますか

設定ファイルや API のレスポンスを、改行や余分な空白を含めずに最小のサイズで送りたいときに使います。整形(読みやすさ)と圧縮(軽さ)はちょうど逆の目的なので、この道具はどちらもボタン 1 つで切り替えられるようにしています。

キーを辞書順に並べ替えると、値は変わりますか

値は変わりません。変わるのはオブジェクトのキーが並ぶ順番だけで、配列の要素の順番はそのままです(配列は順番自体に意味があるデータなので、並べ替えません)。2 つの JSON を見比べて差分を探すときや、提出物のキー順をそろえたいときに使います。

並べ替えを切っていると、書いた順のまま出ますか

出ます。JavaScript の素のオブジェクトは、"1" や "2" のような数字だけに見えるキーを、書いた順に関わらず小さい順に先頭へ並べる決まりが仕様にあります (並べ替えを切っていても起きます)。この道具はオブジェクトを Map で持っていて、Map にはこの並べ替えが無いので、並べ替えを切っている間は書いた順のまま出ます。

末尾のカンマなど、よくある構文エラーには何がありますか

この道具が自前の構文解析で見分けているのは、末尾の余分なカンマ、文字列をシングルクォートで囲んでいる、オブジェクトのキーにダブルクォートが無い、// や /* */ のコメント、数の先頭に余分な 0 が付いている、NaN や Infinity や -Infinity や undefined を値として書いている、の 6 つです。どれも JavaScript のオブジェクトリテラルでは書けても、JSON の文法 (RFC 8259) では許されていません。

大きな整数や 1e400 のような数は、整形すると変わりますか

変わりません。多くの整形ツールは JSON.parse で一度 JavaScript の数 (64 ビットの浮動小数点数) にしてから書き戻すため、18 桁の整数が丸まったり、1e400 のような表せない大きさの数が null になったり、-0 が 0 になったりします。この道具は数を書かれた文字のまま持ち回り、整形・圧縮でもその文字をそのまま書き出すので、こうした変化が起きません。RFC 8259 の 6 節は、安全に相互運用できる整数の範囲を -(2^53)+1 から (2^53)-1 までとし、1E400 のような数は相互運用の問題を示唆すると書いています。MDN の JSON.parse() も、数は JavaScript の数に変換される際に精度を失うことがあると書いています。

この道具に貼った JSON はどこかに送られますか

送られません。構文解析も整形もこのブラウザの中だけで行い、サーバーへの送信も保存もしません。ブラウザの開発者ツールで Network の画面を開き、貼り付けやボタンを押しても通信の行が増えないことで確かめられます。ページを閉じれば入力は消えます。

大きな JSON を貼っても画面が固まりませんか

2,000,000 文字を超える入力は、1 文字も解析せずに断ります。それ以下の入力は、打ち込みや貼り付け自体を React の Concurrent レンダリングで優先させ、構文解析と整形はその後に追いつけばよい更新として扱うので、大きな JSON を貼ってもタイプそのものは固まりません。手元の計測では、上限いっぱいの 2,000,000 文字 (オブジェクトと配列が合わせて 5 万個ほど) でも、構文解析は 1 秒未満で終わります。

同じキーが 2 回出てくる JSON を貼るとどうなりますか

後に書いたキーの値だけが、書いた順の最初の位置に残ります (JavaScript の JSON.parse / JSON.stringify と同じ挙動)。RFC 8259 はオブジェクトのキーが一意であることを「べき」としつつ、一意でないときの振る舞いはソフトウェアに任せており、多くの実装が最後のキーと値だけを残すと述べています。この道具は、消えた値があったことに気づけるよう、「キー〇〇が2回あり、後の値だけ残しました」を「直した箇所」と同じ一覧に出します。

先頭に BOM (U+FEFF) が付いた JSON を貼るとどうなりますか

取り除いてから解析し、取り除いたことを「直した箇所」に出します。RFC 8259 は、ネットワーク越しに送る JSON の先頭に BOM を付けないことを実装に求めつつ、受け取る側が BOM の存在をエラーにせず無視してよいとも書いています。この道具は後者の立場で、BOM 付きの JSON を貼ってもエラーにしません。

「よくある誤りを直して整形」は、何を直して何を直さないのですか

末尾の余分なカンマ、シングルクォートの文字列、引用符の無いキー、// と /* */ のコメントの 4 種類だけを直します。キーのあとの : が無い、値の区切りの , が無いといった、読み手にも何が正しいか分からない壊れ方は直さず、直らなかった理由をそのまま出します。直した箇所は一覧で見えるので、気づかないまま元の意図と違う形になることはありません。

ChatGPT や Claude が出した JSON が読み込めません。直せますか

「生成AIのJSONを直す」を付けると、よくある誤り 4 種類に加えて、コードフェンス (```json のような囲い) と前後の説明文を読み飛ばし、NaN・Infinity・-Infinity・undefined を null に読み替えます。どこを読み飛ばしたか、何を置き換えたかは「直した箇所」に出します。コードを書くところまで含めて学びたい人は、関係する道具とレッスンの AI コーディングの頁を見てください。

JSON と JavaScript のオブジェクトリテラルは何が違いますか

JSON (RFC 8259) は、文字列とキーを必ずダブルクォートで囲む、末尾にカンマを置けない、コメントを書けない、値に関数や undefined を書けない、という決まりがあります。JavaScript のオブジェクトリテラルはこれらをすべて許すので、JavaScript として書いたオブジェクトをそのまま JSON として送ると、JSON.parse や他言語のパーサーで読めないことがあります。

書き手と日付と出典

書き手
ゆめさく
公開日
更新日
  • RFC 8259 The JavaScript Object Notation (JSON) Data Interchange Format

    2017 年 12 月発行 (RFC 7159 を置き換え) ・ に本文を読んで確かめました

    数の先頭に余分な 0 を置けないこと (Leading zeros are not allowed)。6 節で、安全に相互運用できる整数の範囲を -(2^53)+1 から (2^53)-1 までとし、1E400 のような数は相互運用の問題を示唆すると書かれていること。オブジェクトのキーは一意であるべき (SHOULD be unique) だが、一意でないときの振る舞いはソフトウェアに任されており、多くの実装は最後のキーと値だけを報告すると書かれていること。ネットワーク越しに送る JSON の先頭に実装が BOM (U+FEFF) を付けてはならない (MUST NOT) こと、受け取る実装は BOM の存在をエラーにせず無視してよい (MAY ignore) と書かれていること。

  • MDN Web Docs JSON.parse()

    MDN Web Docs の英語版 (2026-10-18 更新) ・ に本文を読んで確かめました

    JSON.parse が文法に合わない文字列を受け取ると SyntaxError を投げること。配列やオブジェクトに末尾のカンマを置けないこと、文字列はシングルクォートでなくダブルクォートで囲む決まりであることが、不正な JSON の例として書かれていること。数は JavaScript の数に変換されたあと精度を失うことがあり、精度を落とさずに大きな数を受け渡すには文字列にして送り、BigInt 等に戻す方法があると書かれていること。

  • Python 3 ドキュメント json JSON encoder and decoder

    Python 3 の英語版 ・ に本文を読んで確かめました

    json.JSONDecodeError が、読めなかった位置を lineno (行番号) と colno (列番号) として持つこと。json.dumps の sort_keys を真にすると、辞書のキーを並べ替えて出力することが書かれていること。

  • Visual Studio Code ドキュメント Basic Editing

    Visual Studio Code の公式ドキュメント (英語版) ・ に本文を読んで確かめました

    Format Document (ファイル全体の整形) の既定のキー割り当てが、Formatting の節で OS ごとに Windows は Shift+Alt+F、macOS は ⇧⌥F (Shift+Option+F)、Linux は Ctrl+Shift+I と書き分けられていること。

次の一歩

JSON は API のレスポンスやコンフィグで必ず出てきます。読み書きのコードまで書けるようになりたい人はコースで、AI に出させた JSON を扱う機会が多い人は AI コーディングの頁も見てください。

ツールの一覧へ戻る