貼り付けるとすぐ整形され、5つの形をサイズと一緒に選べます
JSON整形・圧縮ツールは、1行に詰まったJSONを読みやすく広げたり(整形、フォーマット、beautify)、空白と改行を取り除いて短くしたり(圧縮、minify)します。入力に合わせて結果がすぐ切り替わり、上の見本カード5枚が、2スペース・4スペース・タブ・幅に合わせる・1行にしたときの見た目とサイズ、行数、gzipで送るときのサイズを並べて見せます。使う場面に合う形を選び、コピーするかファイルに保存してください。
このツールは値には手を加えません。数値は9007199254740993や1.50のように書かれた文字のまま写し、同じ名前のキーが2回出てきても両方残します。変わるのは空白と改行、そして選んだ場合のキーの順序と文字列の表記だけです。そのほか、PHPが \u65e5\u672c\u8a9e のように書き出した日本語を文字に戻し、コメントや末尾のカンマが混ざった設定ファイルは直して整形し、ログからコピーした {\"a\":1} 形式のJSONはバックスラッシュを外します。
JSONを広げたい、縮めたいとき
JSONはプログラム同士でやり取りするための形式なので、人が読みやすい形で届くとは限りません。次のような場面でこのツールを使います。
- APIのレスポンスを確認するとき: ブラウザの開発者ツールやcurlで受け取った応答は、たいてい1行です。2スペースで広げると、どの値がどのオブジェクトに入っているかがすぐ分かります。
- 日本語が
\u6ce8\u6587のように見えるとき: PHPのjson_encodeやPythonのjson.dumpsは、既定の設定では日本語を \u のエスケープで書き出します。文字の表記を「\uを文字に」にすれば、同じ値を日本語で読めます。 - 設定ファイルやテストの期待値を比べるとき: キーの順序が違うだけで、比較ツールはほぼ全行が変わったと表示します。2つのファイルを「名前順」に整形してから比べれば、実際に違う値だけが残ります。
- ログからJSONを取り出すとき: ログやデータベースの列では、JSONが文字列として二重に包まれ、
{\"event\":\"login\"}のように残っていることがよくあります。バックスラッシュを外すか、文字列の中のJSONを取り出して整形します。 - 送信や保存のサイズを減らすとき: 1行への圧縮でバイト数は確実に減りますが、サーバーがgzipで圧縮して送る応答なら差は小さくなります。見本カードのgzipサイズで、実際の効果を先に確かめてください。
使い方
- 入力欄にJSONを貼り付けます。「ファイルを開く」を押すか、.jsonファイルを欄にドラッグして開くこともでき、5 MBまで読み込めます。
- 見本カードから出力の形を選びます。カードをクリックするか、カードにフォーカスを置いて矢印キーで移動できます。
- 必要に応じて、キーの順序(元の順序・名前順)、文字の表記(そのまま・\uを文字に・ASCIIに)、「幅に合わせる」の行の長さ(60・80・100・120桁)を変えます。見本カードの数字も一緒に変わります。
- 文法エラーがあると、結果欄がエラー診断に切り替わります。止まった行と列、その付近の原文を示し、直せる表記なら「N か所を直して整形」ボタンが出ます。
- 「結果をコピー」でクリップボードに入れるか、「ファイルに保存」でダウンロードします。1行の形は、ファイル名の末尾が .min.json で保存されます。
5つの形の比較
5つの形が持つ値は同じで、違うのは空白と改行だけです。下の表は、画面の最初の例である「1行のAPIレスポンス」(注文情報、476バイト)を各形に変えた結果です。サイズはUTF-8のバイト数で、gzipはブラウザのgzip圧縮で測ったサイズです。
| 形 | 改行とインデント | 行 | サイズ | gzip |
|---|---|---|---|---|
| 2スペース | 値ごとに1行、1段階ごとに空白2つ | 38 | 694 B | 442 B |
| 4スペース | 値ごとに1行、1段階ごとに空白4つ | 38 | 848 B | 451 B |
| タブ | 値ごとに1行、1段階ごとにタブ1つ | 38 | 617 B | 436 B |
| 幅に合わせる | 80桁に収まるオブジェクト・配列は1行、はみ出すときは2スペースで展開 | 28 | 636 B | 431 B |
| 1行 | 空白も改行もなし | 1 | 476 B | 391 B |
1行に圧縮すると、2スペースよりバイト数は31%減りますが、gzipで圧縮したサイズの減少は12%にとどまります。gzipが繰り返される空白のまとまりを短い記号に置き換えるためです。そのため、Webサーバーが圧縮して送る応答では、空白を消して得られる効果は思ったより小さく、人があとで読むログや設定は整形したままでも問題ありません。逆に、圧縮がかからない場所、たとえば文字数に上限がある入力欄、環境変数、データベースの1つの列に入れるときは、1行の形が確実に短くなります。タブは1段階につき1バイトしか使わないので、2スペース・4スペース・タブのなかでは最小です。
「幅に合わせる」は行をこう分けます
「幅に合わせる」は、外側の値から順に「このオブジェクトや配列を1行で書いたとき、行の長さに収まるか」を調べます。収まれば {"x": 1, "y": 2} のように1行で書き、はみ出すときは広げてから、内側の値を同じ方法で調べます。行の長さには、インデントとキー名、後ろに付くカンマまで含めて数えます。日本語・漢字・かな・全角文字や絵文字は、等幅フォントで2桁分を占めるため2桁として数えます(Unicodeの東アジアの文字幅、UAX #11のWとFの文字)。
短い配列が多いデータで効果が大きくなります。地図データの形式であるGeoJSONは、座標1つを [経度, 緯度] の数値配列で表しますが(RFC 7946 §3.1.1)、2スペースで広げると数値1つごとに行ができます。例「座標リスト(GeoJSON)」は、2スペースだと53行ですが、幅に合わせると座標1つが1行を占めて25行になります。
ほかのツールで同じ形を作るには
プログラムの中で同じ形を作りたいときのオプションです。下の対応は、数値の表記とキーの順序が変わらず、文字列に \u や \/ などのエスケープがないデータであれば、このツールの結果と文字まで一致します。JavaScriptは値を読み込む段階で数値やキーの順序を変えることがあるので、「数値と重複キー」の節もあわせて読んでください。
| このツール | JavaScript | Python (json) | jq |
|---|---|---|---|
| 2スペース | JSON.stringify(v, null, 2) | json.dumps(v, indent=2, ensure_ascii=False) | jq . |
| 4スペース | JSON.stringify(v, null, 4) | indent=4 | jq --indent 4 . |
| タブ | JSON.stringify(v, null, "\t") | indent="\t" | jq --tab . |
| 1行 | JSON.stringify(v) | separators=(",", ":") | jq -c . |
| 名前順 | 標準のオプションなし(自分で並べ替え) | sort_keys=True | jq -S . |
| ASCIIに | 標準のオプションなし | ensure_ascii=True(既定値) | jq -a . |
| 幅に合わせる | 標準のオプションなし | 標準のオプションなし | オプションなし |
JSON.stringifyのインデントは10桁までしか増やせず、jqの --indent は7桁まで受け付けます。Pythonはindentを指定するとカンマの後ろの空白を省き((",", ": "))、indentがなければ (", ", ": ") を使います。PHPのjson_encodeは、JSON_PRETTY_PRINT を付けると4スペースで整形し、既定では日本語を \u のエスケープで、スラッシュを \/ で書き出します。文字のまま出したいときは、JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES を一緒に渡します。
文字の表記: \u のエスケープを文字に戻す、または作る
JSONの文字列の中の文字は、そのまま書いても、バックスラッシュとuの後ろに16進数4桁を付けて書いても構いません(RFC 8259 §7)。2つの表記は同じ値なので、どちらに変えても受け取るプログラムが読む内容は変わりません。既定の「そのまま」は入力の表記に手を加えず、下の2つのオプションを選んだときだけ文字列の文字を書き換えます。
| 入力(そのまま) | \uを文字に | ASCIIに | 説明 |
|---|---|---|---|
"\u65e5\u672c\u8a9e" | "日本語" | "\u65e5\u672c\u8a9e" | 日本語3文字。PHPやPythonの既定の出力でよく見る形 |
"\ud83d\ude4f" | "🙏" | "\ud83d\ude4f" | U+FFFFを超える文字はサロゲートペア、つまりエスケープ2つ(12文字)で書きます |
"https:\/\/example.com" | "https://example.com" | "https:\/\/example.com" | \/ は / と同じ文字です。ASCIIにしても、すでにあるエスケープはそのまま残します |
"caf\u00e9" | "café" | "caf\u00e9" | ラテン文字のアクセント付き文字も同じ扱いです |
"é😀" | "é😀" | "\u00e9\ud83d\ude00" | ASCIIにすると、127番(DEL)以降の文字をすべて小文字の \u 表記に変えます |
"行1\n行2" | "行1\n行2" | "\u884c1\n\u884c2" | 改行 \n は文字列の中にそのまま書けないため、どちらでもエスケープのまま残ります |
"a\u0009b" | "a\u0009b" | "a\u0009b" | タブのような制御文字は文字に戻しません |
"\u200b" | "\u200b" | "\u200b" | 幅のない空白のように見えない文字も、文字に戻しません |
「\uを文字に」は、制御文字、幅のない空白、行・段落の区切り文字、普通の空白と見分けにくい特殊な空白(U+00A0など)のように、画面上で区別できない文字をエスケープのまま残します。文字に戻してしまうと、結果を見てもその文字があるかどうか分からなくなるためです。「ASCIIに」は逆向きで、ASCII以外のすべての文字を小文字の \u 表記に変えます。Pythonのjson.dumpsの既定の出力(ensure_ascii=True)やjqの -a と同じ形で、ASCIIしか安全に通らない古いシステムや転送経路に渡すときに使います。
入力に \u のエスケープで書かれた文字があると、整形結果の下に「エスケープで書かれた文字 N個」と「文字に直す」ボタンが表示されます。例「PHPの出力(\u日本語)」は最初から「\uを文字に」で表示されるので、入力欄と結果欄を見比べてみてください。
キーの名前順の並べ替え
JSONのオブジェクトは、順序のない名前と値の集まりです(RFC 8259 §1)。そのためキーの順序を変えても値は同じで、順序を1つに決めておけば、2つのJSONを比べたりバージョン管理の履歴を見たりするときに、実際に変わった行だけが現れます。「名前順」は次のルールで、すべての階層のオブジェクトのキーを並べます。
- Unicodeのコードポイント順に比べます。数字 → 大文字 → アンダースコア → 小文字 → アクセント付きのラテン文字 → 漢字の順になり、たとえば
2024、Zip、_id、age、é、名前の順です。jqの-SやPythonのsort_keys=Trueも同じ順序です。 - 配列の中の順序は変えません。配列は、順序そのものに意味がある一覧だからです。
- 同じ名前のキーが2回出てきたら両方残し、もとの前後関係を守ります。
- キーは、エスケープを文字に戻した状態で比べます。
"\u0041"と"A"は同じ名前として扱います。
ただし、人が読みやすいように項目の順を整えてある設定ファイルは、もとの順序のままにしておくほうがよいでしょう。RFC 8259も、JSONライブラリによってオブジェクトのメンバーの順序をプログラムに見せるかどうかが異なると述べています。順序に頼るプログラムがある場合は、並べ替えた結果をそのまま渡さないでください。
数値と重複キーはそのまま写します
JSONをプログラムの値として読み込んでから書き戻す方法は、見た目が同じでも中身が変わることがあります。JavaScriptのJSON.parseは数値を64ビット浮動小数点数(IEEE 754 binary64)に変換するため、長い整数の末尾の桁が変わり、整数の形のキーが前に移動し、同じ名前のキーは最後の値だけが残ります。このツールは文字を直接読んで空白だけを置き直すので、下の表のとおり、入力した文字がそのまま残ります。
| 入力 | このツール(1行) | JSON.parseして書き戻す | 何が変わるか |
|---|---|---|---|
{"id":9007199254740993} | {"id":9007199254740993} | {"id":9007199254740992} | 253を超える整数の末尾の桁 |
{"price":1.50} | {"price":1.50} | {"price":1.5} | 小数点以下の0 |
{"n":1E3} | {"n":1E3} | {"n":1000} | 指数表記 |
{"x":-0} | {"x":-0} | {"x":0} | 負のゼロの符号 |
{"b":1,"2024":2} | {"b":1,"2024":2} | {"2024":2,"b":1} | 整数の形のキーが前に移動 |
{"a":1,"a":2} | {"a":1,"a":2} | {"a":2} | 重複キーのうち前の値が消える |
結果を受け取るプログラムが同じ問題に遭う可能性は、別の話です。RFC 8259は、binary64が表せる精度と範囲に収まる数値であれば、やり取りする側が同じ値として読めると述べ(§6)、名前が重複したオブジェクトについては、受け取るソフトウェアによって最後の値だけを使う、エラーにする、すべて報告するなど動作が異なると述べています(§4)。長い識別番号は文字列で受け渡し、重複キーは1つにまとめて送ってください。整形結果の下に出る注意チップがこうした値を知らせ、チップを押すと入力欄のその位置が選択されます。
整形できないとき: よくあるエラーと自動修正
結果欄がエラー診断に切り替わったら、検査が止まった行と列、その付近の原文を示します。実際のミスは、示された位置の少し前にあることが多いです。下の表記は、「直して整形」や「バックスラッシュを外して整形」で一度にJSONの文法へ変えられます。行の並びはそのままで、示した箇所だけを変えます。
| 入力 | 何が問題か | 直した結果 |
|---|---|---|
{"a": 1,} | 最後の項目の後ろのカンマ | {"a": 1} |
{"a": 1 /* メモ */} | コメント(JSONCやJSON5にしかない) | {"a": 1 } |
{'名前': '美咲'} | シングルクォートの文字列 | {"名前": "美咲"} |
{name: "美咲"} | 引用符のないキー | {"name": "美咲"} |
{"ok": True, "memo": None} | Pythonの表記 | {"ok": true, "memo": null} |
[1, NaN, 3] | JSONにない数値 | [1, null, 3] |
{\"a\":1} | 引用符ごとに付いたバックスラッシュ | {"a":1} |
自動では直さないケースもあります。応答が途中で切れて括弧が閉じていないときは、どこまでが元のデータか分からないため、エラー診断は末尾に足すべき閉じ文字だけを知らせます。007 のように先頭に0が付いた数値は、数値として扱うか文字として扱うかを人が決める必要があるので、変更しません。そのようなときは、「入力欄で見る」でその位置を選択して手で直すか、エラーの位置と原因をもっと詳しく表示するJSONチェッカーを使ってください。NaNをnullにするように、値が変わってしまう修正もあるので、結果を一度確認してください。
よくある間違い
- 直して整形した結果で、元の設定ファイルを上書きする: 自動修正はコメントを削除します。コメントがあったJSONCファイルは元を別に残し、整形した結果はJSONしか受け付けない場所に入れてください。
- 片方のファイルだけを名前順に並べ替えて比べる: 順序の違いで、ほぼ全行が変わったことになります。比べる2つのファイルを同じオプションで整形してください。
- 「\uを文字に」の結果を、ASCIIしか受け付けない場所に入れる: 文字に戻した日本語はUTF-8のバイトで出力されます。受け取る側がUTF-8を扱えないときは「ASCIIに」を選んでください。
- 整形した結果をJSON.parseで読み直して、数値を信じる: このツールは9007199254740993をそのまま残しますが、JavaScriptで読み直すと9007199254740992になります。
- 1行への圧縮だけで通信量を減らそうとする: gzipで送る応答では差は大きくありません。使っていないフィールドを削るほうが、より多く減らせます。
- JSONL(1行に1つのJSON)を1つの文書として貼り付ける: 最初の値が終わったあとに文字が続いているというエラーになります。JSON配列とJSONLの変換ツールで配列にしてから整形してください。
制限と注意
- 出力は標準のJSON(RFC 8259)だけです。JSONCやJSON5のコメントと末尾のカンマは、自動修正で消してから整形できますが、コメントを残したまま整形はしません。
- 処理できるのは5 MBまで、入れ子は500段までです。結果が30万文字を超えると、速度のために色付けを省き、文字だけを表示します。
- 「幅に合わせる」の文字幅は、等幅フォントを基準に数えた近似値です。結合文字や一部の記号は、フォントによって実際の幅が違うことがあります。
- 確認するのは文法だけです。必須のキー、値の種類、範囲といったデータの規則(JSON Schema)は検査しません。
- gzipのサイズは、このブラウザの標準のgzip圧縮で測った値なので、サーバー側の圧縮設定やほかの圧縮方式(brなど)を使うと変わります。
- 入力は保存しません。ページを再読み込みすると、最初の例に戻ります。
基準日 RFC 8259・RFC 7946・RFC 9110、PHP・Python・jq・MDNのドキュメント、UAX #11(Unicode 18.0.0)は、2026-10-22に原文で確認しました。サイズの表と、PHP・jq・Pythonの出力は、同じ日にChromium、PHP 8.5.12、jq 1.7.1、Python 3.14で実際に作って比べました。
出典
- 01IETF RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format§1 オブジェクトは順序のない集まり、§2 空白は4種類、§4 名前は一意であるべきで重複の扱いは実装ごとに異なる、§6 binary64、§7 エスケープとサロゲートペア、§8.1 UTF-8とBOM
- 02PHPマニュアル: JSON定数JSON_PRETTY_PRINT、JSON_UNESCAPED_SLASHES、JSON_UNESCAPED_UNICODE(既定は \uXXXX にエスケープ)
- 03Pythonドキュメント: jsonモジュールensure_asciiの既定値はTrue、indent、separatorsの既定値、sort_keys
- 04MDN: JSON.stringify()space引数は10桁まで
- 05jqマニュアル--indent n(7桁まで)、--tab、--sort-keys(-S)、--compact-output(-c)、--ascii-output(-a)、キーの並べ替えはUnicodeのコードポイント順
- 06Unicode UAX #11: East Asian WidthUnicode 18.0.0、幅の広い文字(W)と全角文字(F)
- 07IETF RFC 7946: The GeoJSON Format§3.1.1 位置は経度、緯度の順の数値配列
- 08IETF RFC 9110: HTTP Semantics§8.4 Content-Encoding、§8.4.1.3 gzip
- 09MDN: CompressionStreamブラウザ内でgzip圧縮を行う標準API、2023年5月から主要ブラウザが対応
よくある質問
JSONの整形と圧縮は何が違いますか?
整形(フォーマット、beautify)は、値ごとに改行してインデントを付け、人が読みやすくすることです。圧縮(minify)は、文字列の外にある空白と改行をすべて取り除いて1行にすることです。2つの結果は同じ値を持っており、文字列の中の空白はデータなので、どちらの場合もそのまま残ります。
「幅に合わせる」は2スペースの整形と何が違いますか?
2スペースの整形は値ごとに1行ずつ広げるため、[1, 2, 3]のような短い配列も5行になります。「幅に合わせる」は、オブジェクトや配列を1行で書いたときに決めた行の長さ(既定は80桁)に収まれば1行のままにし、はみ出すときだけ広げます。座標リストのように短い配列が多いデータでは、行数が半分以下になります。
日本語が\uで始まる文字で表示されています。直せますか?
はい。文字の表記を「\uを文字に」に切り替えると、\uのエスケープと\/を文字に戻して書き直します。PHPのjson_encodeやPythonのjson.dumpsは、既定の設定で日本語をこの形で書き出します。2つの表記は同じ値なので、戻してもデータは変わりません。制御文字や幅のない空白のように目に見えない文字は、区別できるようにエスケープのまま残します。
キーを名前順に並べ替えると、データは変わりますか?
JSONのオブジェクトは順序のない名前と値の集まりなので、値は変わりません。名前順は、すべての階層のオブジェクトのキーをUnicodeのコードポイント順(数字、大文字、小文字、漢字の順)に並べ、配列の中の順序と、同じ名前のキーの前後関係はそのままにします。比べる2つのJSONを同じオプションで整形すれば、実際に違う値だけが現れます。
大きな数値や、小数点以下の0もそのまま残りますか?
はい。このツールは数値を計算せず、入力された文字をそのまま写すので、9007199254740993、1.50、1E3がすべて残ります。ただし、結果をJavaScriptのJSON.parseで読み直すと、9007199254740992のように変わることがあるため、長い識別番号は文字列でやり取りするほうが安全です。
コメントや末尾のカンマがあるJSONも整形できますか?
通常のJSONにはコメントも末尾のカンマもないので、そのままではエラーになります。結果欄のエラー診断に、直せる表記が出たら「N か所を直して整形」を押してください。コメントを削除し、末尾のカンマ、シングルクォート、引用符のないキー、True・None、NaNをJSONの文法に変えてから整形します。入力欄でCtrl+Z(⌘Z)を押すと元に戻せます。
ログからコピーした{\"a\":1}のようなJSONは、どう整形しますか?
引用符ごとにバックスラッシュが付いたJSONは、文字列としてもう一度包まれていた名残です。貼り付けると、エラー診断に「バックスラッシュを外して整形」が出ます。一番外側が二重引用符で包まれた文字列なら「取り出して整形」が出ます。どちらも1回押すだけで、中のJSONを取り出して整形します。
入力したJSONはサーバーに送信されますか?
いいえ。整形、圧縮、エラー検査、gzipサイズの測定はすべてこのブラウザ内で実行され、入力した内容をサーバーに送ったり保存したりしません。ページを再読み込みすると、入力は消えて最初の例に戻ります。