メインコンテンツへ移動

JSONプリティプリント

このツールは、JSONにインデントと改行を付けて、人間が読める形へ整形します。下にドキュメントを貼り付ければここで整形できますし、お使いの言語で同じことをする1行のコードを持ち帰ることもできます。対象はJavaScript、Python、Go、Java、C#、PHP、Ruby、Rust、jq、PowerShell。それぞれに、人が引っかかるデフォルトの説明が付いています。こうしたAPIには必ず、引っかかるデフォルトがあるからです。

端末内で処理
インデント
JSON
0 B1 行行 1、列 1
整形済み読み取り専用
0 B1 行
使用する言語で

標準搭載。ブラウザーとNodeで依存パッケージなし。

JavaScript — 整形読み取り専用
225 B7 行
注意すべき既定の動作 第2引数はインデントではなくreplacerです。JSON.stringify(value, null, 2)を使ってください。undefined、関数、シンボルは省略される場合があり、BigIntはTypeErrorになります。

JSONプリティプリントはどう動きますか?

JSONのプリティプリントが意味するのは1つだけです。ドキュメントをパースし、カンマの後に改行、ネスト1レベルごとに1レベルのインデントを付けて書き戻す。バイト列としては等価で、パーサーには両者の区別がつきません。それでも片方は読め、もう片方は壁です。

2つの別々の問いに、1つのページで答える

これを探している人が欲しいのは、2つのうちどちらかです。ペイロードを貼り付ける箱——それが上のパネル——か、書いているプログラムの中で整形する1行のコード——それがその下のピッカー——か。このページは両方に答えます。json.dumps(obj, indent=2)が必要なときに整形ウィジェットへ飛ばされるのは、クリックの無駄だからです。

どの言語にも、誰かが引っかかるデフォルトがある

知っておく価値があるのはここで、だからこそこのレシピ集は1行コードの羅列ではなく、1つ1つに注釈を付けています。Pythonはensure_ascii=Falseを渡さない限り、非ASCII文字をすべてエスケープします。caféはcaf\u00e9として届きます。Goは<、>、&をエスケープします。出力がかつて<script>タグに入る可能性があったからです。PHPはスラッシュをエスケープするので、出力中のURLはどれも壊れて見えます。PowerShellのConvertTo-Jsonは、2レベルより深くネストされたものを切り詰め、警告もしません。残りを型の名前で黙って置き換え、平然と続けます。

そしてJavaScriptでは、間違いは呼び出し自体にあります。JSON.stringify(value, 2)は正しく見え、コンパイルも通り、実行もされるのに、最小化された文字列が返ってきます。第2引数はreplacer関数で、インデントは第3引数だからです。

キーの並べ替えは別の判断

キーをアルファベット順に並べると、同じドキュメントの2つのバージョンを差分比較できます。それこそが、並べ替える理由のすべてです。並べ替えないと、挿入順にキーを出力するシリアライザーは、移動だらけの差分を生みます。このツールではデフォルトでオフです。ドキュメントの順序を変えてしまうためで、設定ファイルやロックファイルでは、その順序自体に意味があることがあるからです。

インデントと、何を選ぶべきか

2スペースはWebとJavaScriptの慣習で、深くネストしたドキュメントも画面に収められます。4スペースはPythonをはじめバックエンド世界の標準です。タブは読者それぞれが幅を選べる方式で、これがタブの最も強い論拠であり、一部のプロジェクトがタブを断固として要求する理由でもあります。3つのどれが正しいということはなく、唯一の誤りは1つのファイルの中で混在させることです。

データの意味は変わらない

トークン間の空白はJSONでは意味を持たないため、プリティプリントは可逆でロスレスです。出力をミニファイアーに通せば、キーを並べ替えでもしない限り、入力がバイト単位でそのまま返ってきます。変わるのはサイズです。インデントはドキュメントを20–40%膨らませることがあり、通信では問題になりますが、人が読むログではまったく問題になりません。

ドキュメントがパースできないなら、ここでは何も整形できません。下のエラーに行と列が示されます。「JSON検証」は、よくある原因——末尾カンマ、シングルクォート、引用符のないキー——の修復も提案してくれます。

何もアップロードされない

パースも再直列化も、すでに読み込まれたJavaScriptによって、このタブの中で行われます。プリティプリントされるペイロードはAPIレスポンスやログ行で、トークンや顧客レコードが日常的に含まれます。このページのContent-Security-Policyはconnect-src 'self'を設定しているため、ブラウザはアップロードを単に試みないだけでなく、ブロックします。

最小化済み

{"id":42,"tags":["prod","payment"],"ok":true}

整形済み

{
  "id": 42,
  "tags": [
    "prod",
    "payment"
  ],
  "ok": true
}

JSONプリティプリントが対応するオプションとエッジケースは?

技術リファレンスとオプション
パラメータ型デフォルト動作とエッジケース
JavaScriptJSON.stringify組み込みJSON.stringify(value, null, 2)。2番目の引数がリプレーサーで、そこに2を渡しても何も起こりません。
Pythonjson.dumps標準ライブラリjson.dumps(obj, indent=2)。ensure_ascii=Falseを追加しないと、非ASCII文字すべてがエスケープされます。
jqシェル—jq . file.jsonで実行し、jq -S .でキーをソートします。jq 1.7以前では、大きな整数が黙って変更されていました。
コマンドラインpython3 -m json.tool—--indent、--sort-keys、--no-ensure-asciiオプションを備えた、ほぼすべてのマシンに搭載されています。
Goencoding/json標準ライブラリ値にはjson.MarshalIndent、既に持つバイトにはjson.Indentを使用。どちらも不等号をエスケープします。
JavaJackson—writerWithDefaultPrettyPrinter()。デフォルトでは配列を1行で出力し、配列インデンターを設定するまでそのままです。
C#System.Text.Json.NET Core 3+JsonSerializerOptions { WriteIndented = true }。仕様が要求する以上に多くの文字をエスケープします。
PHPjson_encode組み込みJSON_PRETTY_PRINTに加え、ほぼ必須のJSON_UNESCAPED_SLASHESとJSON_UNESCAPED_UNICODEを使用します。
RubyJSON.pretty_generate標準ライブラリコンパクトに保たれるto_jsonとは異なります。
Rustserde_json—to_string_pretty。キーはpreserve_order機能が有効でない限りソートされます。
PowerShellConvertTo-Json組み込み-Depth 2がデフォルトで、それ以下は黙って切り捨てられます。常に-Depthを明示的に渡してください。

よくある質問

JavaScriptでJSONをプリティプリントするには?

JSON.stringify(value, null, 2)です。3つの引数は、値、replacer、インデントです。だから誰もが一度はやる間違いがJSON.stringify(value, 2)で、2がreplacerの位置に入り、何もせず、最小化された文字列を返します。タブにするには、2の代わりに"\t"を渡します。stringifyが道中で黙って捨てるものにも注意してください。undefinedの値と関数はオブジェクトから消え、配列の中ではnullになります。MapやSetは{}になり、BigIntは例外を投げます。

PythonでJSONをプリティプリントするには?

json.dumps(obj, indent=2)です。人が引っかかるデフォルトはensure_ascii=Trueで、非ASCII文字をすべてエスケープします。「café」は「caf\u00e9」になって、有効なのに読めない出力になります。UTF-8のままにするにはensure_ascii=Falseを渡します。その場合は、出力ファイルをencoding="utf-8"で開いてください。sort_keys=Trueでアルファベット順に並び、2つのダンプを差分比較できるようになります。

コマンドラインでJSONをプリティプリントするには?

jqが入っていればjq . file.json、入っていなければpython3 -m json.tool file.jsonです。後者は、Pythonが入っているほぼすべてのマシンをカバーします。jqでは-Sでソート、--indentでインデント幅の指定、-cで圧縮を追加できます。注意点を1つ。jq 1.6までは数値がdoubleとしてパースされるため、64ビットのIDが黙って変わって返ってくることがありました。jq 1.7は変更されていない数値リテラルを保持します。識別子を通す前にバージョンを確認してください。

整形したJSONは依然として有効なJSONですか?

はい、有効です。トークン間の空白はJSONでは意味を持たないため、インデントされたドキュメントも最小化されたドキュメントも、まったく同じ値にパースされます。RFC 8259は、構造トークンの間のどこにでもスペース、タブ、改行、復帰を置けるとしています。違いはサイズだけです。インデントは通常20–40%膨らませます。ペイロードをネットワークに送る前には取り除く価値があり、人が読むものには保持する価値があります。

プリティプリント、フォーマット、ビューティファイの違いは何ですか?

動詞としては、違いはありません。どれも、構造が見えるように空白を加えることを意味します。このサイトの3つのページが違うのは、そのほかの部分です。このページは、整形機能と言語ごとのコードを並べています。「JSON整形」は全オプションを備えています。JSONCコメントの除去、キー並べ替え、Unicodeエスケープです。「JSONビューティファイア」は、最小化された塊を読める形に戻すという特定の仕事に的を絞っています。目的に合うものを選んでください。

整形した出力に\uエスケープが入るのはなぜですか?

シリアライザーが非ASCII文字をエスケープしたからです。デフォルトでそうする処理系はいくつもあります。Pythonのjson.dumpsはensure_ascii=Trueです。C#のSystem.Text.Jsonは、HTML-safeエンコーダーが嫌うものをすべてエスケープします。PHPは、そうしないよう指示しない限り非ASCIIをエスケープします。どれも有効なJSONですが、どれも読めません。対処はいずれも引数1つです——ensure_ascii=False、UnsafeRelaxedJsonEscaping、JSON_UNESCAPED_UNICODE——上のピッカーには、お使いの言語に対応するものが表示されています。

JSONはサーバーにアップロードされますか?

いいえ。パースと再直列化は、ページにすでに読み込まれたJavaScriptによってこのタブの中で行われ、送り先となるエンドポイントがそもそもありません。これは聞こえ以上に重要です。プリティプリントされるドキュメントはAPIレスポンスやログ行で、トークン、セッション識別子、顧客レコードを日常的に運んでいます。このページはconnect-src 'self'つきで配信されるため、別オリジンへのリクエストはブラウザ自体がブロックします。