JSON を整形

JSON を貼り付けて読んでください。ブラウザーに組み込まれたパーサーで解析し、選んだ字下げで書き直すので、出てくるのはまったく同じ文書です。改行を差し込まれただけのテキストではありません。何も送信されないので、いま見ているのが顧客データを含む API のレスポンスであっても、あなたのタブの中に留まります。

差分を取る前に便利です。配列の順序には決して触れません。配列は並びそのものが意味だからです。

結果

入力すると、ここに答えが出ます。

  • 処理される場所

    ファイルがないので、何もアップロードされません。計算はこのページの中で行われます。

  • 順番待ちもアカウントもなし

    お使いの機械の速さで答え、あなたが誰かを尋ねることはありません。

  • 何度でも

    回数は数えず、上限もありません。もう一度答えることに費用はかからないからです。

仕組み

  1. JSON を欄に貼り付けてください。
  2. 字下げを選び、2 つの文書を比べるならキーを並べ替えます。
  3. 結果をコピーします。端末からは出ていません。

解析します。見た目を繕うのではなく

ここでの整形は、文書全体を読んで書き直すことです。安上がりな代替——波かっこが出てきたところで改行と空白を差し込む——は、文字列の中に波かっこが入るまでは動きます。そこから先は、JSON に見えたままの形で文書を壊します。

有用な帰結として、整形は検査も兼ねます。結果が出れば文書は妥当で、出なければ妥当ではありません。そのための検証ページがあり、どの行で詰まるかを教えます。決して失敗しない整形ツールは、渡されたものを読んでいない整形ツールです。

スペース 2 つ、4 つ、タブ

スペース 2 つは `JSON.stringify` に字下げを頼んだときの出力で、JavaScript 系の道具のほぼすべての既定です。4 つは Python と Java の世界から来ています。タブはバイト数を節約し、幅を各自のエディターに委ねます。

3 つとも文書は変えません。パーサーにとって要素間の空白は存在しないからです。効いてくるのは結果がリポジトリに入る場合だけで、規約が混ざると誰も触っていない行に差分が出ます。1 つに決めて、それを人ではなく道具に守らせるべき理由がこれです。

キーの順序と、配列の順序

JSON のオブジェクトに定義された順序はないので、2 つのサービスが同じデータをキーの並び違いで返すことがあります。アルファベット順に並べ替えれば、テキストの比較が意味のある比較になります。差分や契約テストの前に必要なのはまさにそれです。

配列は逆で、順序がデータの一部です。ここでは決して触りません。この非対称は意図的なものです。配列まで並べ替える道具は、比較はきれいに通るのに意味が変わった文書を生みます。考えうる最悪の組み合わせです。

数値が苦しくなる境目

JSON は数値をテキストとして書き、JavaScript はそれを倍精度浮動小数点として読みます。約 9007 兆を超える整数は桁を失います。19 桁の識別子が別物になって戻り、しかも結果は妥当な数値に見えるので誰も気づきません。

JavaScript のパーサーを通るあらゆる処理が影響を受けます。ここも含みます。起きたときは注意を出します。よくある引き金は Twitter や Discord の snowflake 形式の識別子と、一部のデータベースの連番です。解決は生成する側にあります。その種の値は文字列として送るべきで、そうすればどの段も無事に通り抜けます。

JSON にないもの

コメントはありません。末尾のカンマもなく、シングルクォートもなく、引用符のないキーもありません。どれも JavaScript から持ち込まれた習慣で、どれもパーサーを止め、しかもその位置はたいてい正しい場所を指しません。

設定にコメントが要る場合の出口は 3 つです。コメントを許す形式を使う——YAML、TOML、JSON5——、意図的に無視される `_comment` という項目を置く、処理前に取り除く。3 つめが最も広く行われ、最も脆いものです。二重スラッシュは URL の中にも出てくるからです。

日本語はそのまま残ります

結果は UTF-8 のまま出ます。非 ASCII の文字を `\uXXXX` のエスケープ列に変換しません。どちらも妥当な JSON で意味も同じですが、前者は読めて後者は読めません。「山田」を `\u5c71\u7530` と書いたものは正しく、そして読めません。

一部のライブラリが既定でエスケープするのは、経路が安全でないと想定しているからで、それはとうに事実ではなくなりました。データがそのエスケープ列付きで届く場合、この整形ツールは元に戻しません。受け取ったとおりの文書の一部であり、変えることは表示ではなくデータを書き換えることだからです。

何のためのページで、何のためではないか

このページが解くのは読解の問題です。目の前に文書があるのに、その形が見えない。1 行の API レスポンスが届いたとき、ログの項目に JSON が入っているとき、誰かがチケットに設定の塊を貼り付けたときに必要になります。

逆の問題は解きません。1 行にするには最小化のページがあり、なぜ弾かれるのかを知るには行と列を出す検証のページがあります。3 つは同じエンジンを共有し、3 つの異なる場面の 3 つの異なる問いだから分かれています。

リポジトリでは整形、配信時に最小化

バージョン管理されたファイルの中の最小化された JSON は、どんな変更も「1 行が変わった」に変えます。差分は全か無かになり、レビューは不可能になり、マージの衝突は問題の 2 項目ではなく文書全体に及びます。

うまくいく分担は明白です。リポジトリでは整形、配信時に最小化。その 2 つの状態のあいだにあるのが、ビルド工程が自動で踏むべき手順です。どちらの形も抽象的に正しいわけではなく、置かれる場所において正しいだけです。

個人情報保護法から見たときの位置

JSON のペイロードは、動かさないほうがよいものをそのまま含みがちです。顧客の記録、注文データ、氏名や住所の入った webhook。ここでは解析も書き直しもページの中で行われるので、当方への提供が起きず、その内容についての第三者提供も委託も生じません。

ネットワークパネルで示せます。使っているあいだ、文書を運ぶリクエストは出ません。サーバー版なら社内規程とぶつかる場面でこのツールが使える理由がそこにあり、確認には 1 分もかかりません。

JSON を整形:よくある質問

整形すると文書は変わりますか。

いいえ。解析して書き直すのでデータ構造は同一です。変わるのは要素間の空白だけで、それはパーサーにとって存在しません。配列の順序には決して触れません。

どの字下げを使うべきですか。

行き先が JavaScript ならスペース 2 つ、Python や Java の世界から来た文書なら 4 つ、幅を各自に委ねたいならタブです。パーサーには無関係で、効いてくるのはリポジトリに入る場合だけです。

長い識別子が変わってしまうのはなぜですか。

JavaScript が数値を倍精度浮動小数点として読み、約 9007 兆を超える整数が桁を失うからです。その種の識別子は JSON では文字列として運ぶべきで、そうすればどの段も無事に通ります。

コメント入りの JSON が弾かれるのはなぜですか。

JSON にコメントがないからです。末尾のカンマも引用符なしのキーもありません。設定にコメントが要るなら、適した形式は YAML、TOML、JSON5 です。

文書は送信されますか。

いいえ。解析も出力もこのページの中、お使いのブラウザーで行われます。確認はネットワークパネルで。使っているあいだ、JSON を運ぶリクエストは出ません。

他のツール