JSON フォーマッター

JSON を 2 スペース、4 スペース、タブのいずれかのインデントで整形するか、1 行に圧縮できます。解析できないときは壊れている行と列を正確に示します。

インデント
入力
出力

ここに結果が表示されます

この JSON フォーマッターの役割

JSON (JavaScript Object Notation) は、プログラム間で構造化データをやり取りする最も一般的な形式です — API 応答、設定ファイル、ログ行などです。コンパクトに設計されており、それゆえオブジェクトが数階層ネストしたり 1 行で届いたりすると読みにくくなります。このツールは貼り付けた JSON を 2 通りに書き直します: 一貫したインデントで構造がひと目で分かる整形版か、任意の空白をすべて取り除いて回線上でできるだけ小さくした圧縮版です。

整形と同時に検証も行います。再直列化する前にテキストを解析するため、不正な JSON が誤解を招く出力を生むことはありません — 代わりに、割り出せるかぎりは解析が失敗した行と列が示されるので、問題箇所へ直接飛べます。

整形と圧縮 — それぞれの使いどころ

二つのモードは正反対の目的を持ち、多くの作業では段階に応じて両方を使います:

  • 読んだりデバッグしたりするときは整形 — API 応答を調べる、2 つのペイロードを比べる、プルリクエストで設定ファイルを確認する、といった場面です。インデントが文字の壁を、たどれるツリーに変えます。
  • 送り出すときは圧縮 — JSON を HTML に埋め込む、Cookie やキャッシュに保存する、1 バイトを惜しむリクエスト本文に載せる、といった場面です。圧縮された JSON は、空白を除いただけのバイト単位で等価なデータです。

インデントの選択 (スペース 2 個、4 個、タブ) は整形出力にのみ影響します。スペース 2 個は JavaScript と Web ツールで最も一般的な慣習で、スペース 4 個やタブはそれを好むチームに向いています。どれを選んでも結果は有効な JSON のままです — インデントは純粋に見た目だけのものです。

検証エラーの読み方

JSON が不正なとき、このツールは素っ気ない「無効」ではなく、最初の問題の行と列を報告します — 行と列がどこを指すかの節が述べる、ただ一つの場合を除いて。エンジンのエラーメッセージはブラウザによって異なり、位置を省くことも多いため、位置は独立して計算され、調べ始めるのに妥当な箇所を指します。最初のエラーを直して再確認してください — 1 つのはぐれ文字が、いくつもの見かけ上の問題に波及することがよくあります。

よくある JSON の誤り

JSON は、似ている JavaScript のオブジェクトリテラルよりも厳格です。人がつまずきやすいのは次の誤りです:

  • 末尾のカンマ: オブジェクトや配列の最後の項目の後ろのカンマは、JavaScript では有効ですが JSON では無効です。
  • 単一引用符: JSON の文字列とキーは二重引用符を使わなければなりません。'value' は無効で、"value" が正しい形です。
  • 引用符のないキー: すべてのオブジェクトのキーは引用符付きの文字列でなければならないので、{ name: "x" } は { "name": "x" } にする必要があります。
  • コメント: JSON にはコメント構文がありません。// や /* */ は解析エラーになります。
  • 特別な数値: NaN、Infinity、-Infinity は有効な JSON の数値ではありません。
  • 誤った引用符: ワープロから貼り付けた「スマートクォート」は引用符に見えますが別の文字であり、解析できません。

報告される行と列が指しているもの

位置は、あなたが何かを書き落とした場所ではありません。パーサーがそこにあってはならないものに初めて出会った場所であり、この二つは通常べつの場所です。下のオブジェクトでは 3 行目を閉じるはずのカンマが欠けていて、このツールは 4 行目、3 列目 — 次のキーを開く引用符 — を報告します。その引用符が来るまで誤りは何もありませんでした。文書は 3 行目のあとで正しく終わることもできたからで、パーサーが書き落としを知るのは、カンマでも閉じ波括弧でもないものに出会ったときだけなのです。

{
  "id": 42,
  "name": "widget"
  "price": 9.99
}
  • カンマの欠落は、そのあとに続くものの最初の文字の位置で報告されます。上のようにインデントされた JSON ではそれが次の行になるので、示された行はその一つ上の行と合わせて読んでください。
  • 余分なカンマは閉じ括弧の位置で報告されます。最後のペアが 2 行目にあるオブジェクトなら 3 行目、1 列目です。カンマはもう一つペアが来ると約束し、括弧はその約束を破るものだからです。
  • 閉じられていない文字列は、たいていは開いた引用符ではなく、その文字列が始まった行の末尾で報告されます。あとの行にある次の引用符が、別の場所でそれを閉じてしまうことがあるからです。改行は JSON の文字列の中に置けないので、改行がそこにあってはならない最初の文字になります。
  • 完璧に見える文書で 1 行目、1 列目と出るときは、たいていバイト順マークです。一部のエディターは UTF-8 として保存するときにこれを書き込みます。目に見えず、開き波括弧の前に座り、JSON にはその置き場所がありません。

そして位置をまったく割り出せないときは、推測した座標を挙げるのではなく、位置を付けずに失敗だけを報告します。自信ありげに示された行と列が完全に正しい構文を指していれば、あなたは間違った場所を探すことになり、それは文書が解析できないと知るだけよりも悪いのです。

整形が変えるものと保つもの

ほとんどの文書では、答えは空白だけで、ほかには何もありません。しかしこのツールはあなたのテキストを編集するのではなく、実際の値へ解析してその値を書き直します。そしてこの往復に耐えないものが五つあります。どれもツールの欠陥ではなく — それぞれ、数値やオブジェクトとは何かについて JSON 仕様が述べていることです — どれも、出力を元のテキストに上書きする前に知っておく価値があります。

  • 同じキーを二度書いた場合: 二つのうち後のものだけが残ります。オブジェクトは一つのキーを二度持てないからです。RFC 8259 は、名前が重複したオブジェクトを受け取るソフトウェアの振る舞いは予測できないと述べており、別のパーサーは先のほうを残すこともあるので、二つのうちどちらが残るかも頼りにできることではありません。
  • 十五桁より長い整数: JSON の数値は倍精度浮動小数点として読まれ、これは 2 の 53 乗までの整数をすべて正確に保ちます — 十六桁の数です — ですから十五桁の整数は必ず残り、それより長いものは残らないことがあります。12345678901234567890 を貼り付けると 12345678901234567000 が出てきます。長いデータベース識別子がいつもの犠牲者です。できるなら文字列のままにしてください。
  • 指数形式と末尾のゼロは正規化されます: 1e3 は 1000 として、1.50 は 1.5 として戻ります。標準の書き方で書かれた同じ数です。
  • その表現が支えられる範囲の外にある量は、まるで別のものとして戻ります: 1e400 には倍精度の値がなく null として戻り、1e-400 は 0 として戻ります。長い小数は、長い整数と同じように、その表現が持つ精度に丸められます。
  • エスケープはそれが表す文字になります: \u00e9 は é として戻り、エスケープされたサロゲートペアはそれが綴る絵文字として戻ります。どのパーサーにとっても同じ文字列で、二つの書き方のうち一方が単に短いだけです。

キーの順序はあなたが書いたとおりに保たれますが、知っておく価値のある例外が一つあります。数字だけからなり、素朴な非負の整数として読めて、およそ四十億より小さいキーは配列の添字として扱われ、どこに書いてあっても、数値の順でそのオブジェクトの先頭に戻ってきます。ほかには何も動きません。ほかのキーが並べ替えられることはなく、加えられたり名前を変えられたりすることもありません。このどれかが気になるなら、整形ではなく圧縮して、結果を元のテキストと一文字ずつ比べてください。往復が何をしたかを見るいちばん短い道です。

読みたい JSON が文字列の中にあるとき

ウェブフックのログ、メッセージキュー、データベースの列は、JSON 文書ひとつをまるごと一つの文字列値として運ぶことがとても多く、その中の引用符はすべてエスケープされています。外側の文書は完全に有効なので、ツールはそれを整形して有効と報告します — そしてあなたが読みに来た部分は、長い一行のバックスラッシュのままです。何も壊れていません。これは二つの文書で、一方が他方の文字列の中に包まれているのです。

{
  "event": "order.created",
  "payload": "{\"id\":42,\"total\":19.99}"
}

読むには二回の手順が必要になります。外側の文書をここで整形し、目的の文字列の引用符のあいだにあるものをコピーし、エスケープを解いて、その結果をもう一度貼り付けてください。JSON 文字列エスケープのツールがその中間の手順を行います。そのエスケープ解除の向きは、バックスラッシュとそれに続く引用符を二重引用符そのものに戻し、その行をこのページが整形できる文書に戻します。ファイルを作ったものを自分で制御できるなら、より良い直し方は上流にあります。ペイロードを文字列ではなく入れ子のオブジェクトとして送れば、どちらの手順も要りません。

一行に一つのオブジェクトは一つの文書ではない

ログファイル、API のエクスポート、ストリーミングのエンドポイントは、一行に完全な JSON オブジェクトを一つ持つことがよくあります。この形式は JSON Lines、または NDJSON と呼ばれます。各行はそれ自体で有効な JSON ですが、ファイルは JSON 文書ではありません。JSON 文書は最上位の値をちょうど一つ持つのに対し、これは複数を、一つずつ続けて、それらをつなぐものなしに持っているからです。

{"level":"info","msg":"started"}
{"level":"warn","msg":"retrying"}
{"level":"error","msg":"gave up"}

それをここに貼り付けると、ツールは 2 行目、1 列目を報告します。最初のオブジェクトはきれいに終わり、そして文書が終わっているべき場所で二つ目が始まったからです。そこからの道は二つあります。一度に一行だけ整形する — ログの一件を読んでいるときに欲しいのはこれです。あるいはファイルを一つの文書にする — 行を角括弧で包み、最後の行以外のすべての行末にカンマを置く — 配列を期待する何かにまとめて読み込ませようとしているときに欲しいのはこれです。

よくある質問

私の JSON はサーバーに送られますか?
いいえ。解析・検証・整形はすべて JavaScript を使ってブラウザ内で行われます。貼り付けた内容がアップロード・保存・記録されることはないため、機密のペイロードにも安全に使えます。
整形するとデータが変わりますか?
ほとんどの文書ではいいえ。整形と圧縮はトークン間の空白を足し引きするだけで、キー・値・構造は同じものが戻ります。ただし例外があり、どれもテキストを実際の値へ解析してから書き直すことの帰結です。整形が何を変えるかの節がそのすべてを挙げています。
数値が並べ替えられたり書き換えられたりするのはなぜですか?
このツールは JSON を実際の値に解析して直列化し直すため、数値は正規形に整えられます (例えば 1e3 は 1000 になります)。倍精度浮動小数点が正確に保てる数なら、値は変わらず、その書き方だけが標準になります。その表現が持つより多くの精度や範囲を要する数 — 十五桁を超える整数、長い小数、あるいはまったく範囲外の量 — では値そのものが動き、整形が何を変えるかの節がその仕方を述べています。
とても大きな JSON ファイルも扱えますか?
大きなペイロードも扱えますが、すべてがブラウザ内で動くため、極端に大きなファイル (数十メガバイト) は端末によっては遅くなったり、メモリの上限に達したりすることがあります。
オブジェクトのキーの順序は保たれますか?
ほとんどの場合は保たれます。キーの順序は入力に現れたとおり正確に保たれ、このツールがみずから並べ替えることはありません。唯一の例外は、数字だけからなり、素朴な非負の整数として読めて、およそ四十億より小さいキーです。これは配列の添字として扱われ、数値の順でそのオブジェクトの先頭に戻ってきます。JSON はオブジェクトを順序のない集まりと呼ぶので壊れているわけではありませんが、驚きではあります。整形が何を変えるかの節にその詳細があります。
JSON と JavaScript のオブジェクトの違いは何ですか?
JSON はデータ交換のためのテキスト形式で、JavaScript のオブジェクトはメモリ上の値です。JSON はより厳格で、二重引用符付きのキーと文字列を要求し、末尾のカンマとコメントを禁じ、決まった種類の値 (文字列・数値・真偽値・null・配列・オブジェクト) しか許しません。
JSON5 や JSONC (コメント付き JSON) を整形できますか?
いいえ。このツールは厳格な標準 JSON を検証します。JSON5 や JSONC はコメントなどの便利機能を加えたもので、JSON 仕様の一部ではないため、エラーとして報告されます。
文字列や数値だけでも有効な JSON ですか?
はい。JSON 文書は任意の単一の値なので、"こんにちは"、42、true、null はそれぞれ完全で有効であり、このツールは四つとも整形します。ずっとそうだったわけではありません。RFC 4627 (2006) は最上位にオブジェクトか配列を要求し、RFC 7159 が 2014 年にそれを緩め、今日は RFC 8259 が緩いほうの規則を担っています。単一の値を拒むものは、古い仕様に従っているのです。
ここで JSON Lines や NDJSON を整形できますか?
一度に一行なら、できます。各行が完全な JSON 文書です。ファイル全体を一度に、はできません。それは一つではなく複数の文書で、ツールは二つ目が始まる 2 行目、1 列目を報告します。上の一行に一つのオブジェクトの節が、二つの抜け道を扱っています。
正しく見える文書で 1 行目、1 列目と報告されるのはなぜですか?
ほとんどの場合、開き波括弧の前にある目に見えない文字のせいで、しかもほとんどの場合、エディターが UTF-8 として保存したときに残したバイト順マークのせいです。実在する文字で、目には見えず、JSON にはその置き場所がありません。バイト順マークなしの UTF-8 でファイルを保存し直すか、いちばん最初の文字を削って貼り直してください。
整形すると重複したキーは落ちますか?
はい。そして出力が入力より少なくなる唯一の場合がこれです。同じオブジェクトの中に二度書かれたキーは、二つのうち後のものだけを残します。ツールがあなたのテキストを実際の値へ解析し、オブジェクトは一つのキーを二度持てないからです。どちらが残るかも持ち運べる話ではありません: RFC 8259 は、そうしたオブジェクトを受け取るソフトウェアの振る舞いは予測できないと述べており、別のパーサーは先のほうを残すことがあります。

関連するツール