JSON フォーマッター
JSONを整形・圧縮し、構文エラーの位置を確認
処理中…
0.0
停止していません。計算が終わると結果が表示されます。
JSON フォーマッターについて
このツールは、貼り付けたテキストをブラウザ内蔵の JSON.parse で読み込み、JSON.stringify で書き出し直します。つまり結果は「入力の見た目を整えたもの」ではなく、「エンジンが解釈した値を新しく出力したもの」です。0.1000 が 0.1 に、1E3 が 1000 に、\u00e9 が é に変わって出てくるのはこのためです。
JSON の文法はごく小さいものの、手書きしたり JavaScript のオブジェクトリテラルをコピーしたりすると、規格外の書き方が簡単に紛れ込みます。以下では、仕様(RFC 8259、ECMA-404)が実際に認めている範囲、つまずきやすい箇所、そして解析の過程で値が変わってしまうケースを扱います。
よく使われるが仕様では不正な書き方
RFC 8259 では、JSON テキストは値ひとつです。以前の仕様は最上位をオブジェクトか配列に限っていましたが、現在は "hello"、42、null だけでも正しい JSON で、このツールもそう扱います。一方、次の書き方はすべてエラーになります。
- 末尾のカンマ:{"a": 1,}、[1,2,3,]
- シングルクォートの文字列、クォートなしのキー:{'a': 1}、{a: 1}
- コメント:// も /* */ も存在しない
- NaN・Infinity・-Infinity:仕様は「文法で表せない数値(Infinity や NaN など)は認めない」としています。逆に JavaScript で JSON.stringify({x: NaN}) を実行すると、エラーなしで {"x":null} になり、値が黙って消えます。
- 先頭のゼロ:01 はエラー。0.5 は正しいが .5 はエラー
- 空白として認められるのはスペース、タブ、LF、CR の4種類だけです。ファイル先頭の BOM(U+FEFF)は含まれないため、JSON.parse は1文字目で失敗します。RFC 8259 はネットワークで送る JSON に BOM を付けてはならない(MUST NOT)と定めています。「UTF-8(BOM付き)」で保存したファイルが先頭でエラーになるなら、これが原因です。
コメントが書けるファイルは JSON ではない
VS Code の settings.json、tasks.json、launch.json は「JSON with Comments(jsonc)」モードで開かれ、// と /* */ のコメントが使え、末尾カンマも警告だけで済みます。JSON5 はさらに、シングルクォート、クォートなしのキー、Infinity まで認める別の形式です。こうしたファイルをそのまま貼ってエラーになるのは正常な動作です。コメントと末尾カンマを消してから入れるか、その形式用のパーサーを使ってください。
解析で値が変わる3つのケース
1つ目は重複キー。仕様はキーが一意であるべき(SHOULD)とするだけで、重複した場合「受け取るソフトウェアの挙動は予測できない」と書いています。JavaScript は最後の値を残すので、{"a":1,"a":2} は {"a": 2} と出力され、最初の値は跡形もなく消えます。他の言語のパーサーは最初の値を使ったり、エラーにしたりすることがあります。
2つ目は大きな整数。JavaScript の数値は IEEE 754 倍精度で、RFC 8259 が相互運用できるとする整数は -(2^53-1) から 2^53-1(9007199254740991)までです。これを超える64ビット ID は下の桁が変わります。Twitter(現 X)の API がツイート ID を数値の id と文字列の id_str の両方で返し、JSON では id_str を使うよう開発者向け文書で案内していたのはこのためです。JSON.parse はこうした値をエラーなしで丸めるため、このツールは入力から 2^53 を超える整数を見つけて警告を表示します。
3つ目はキーの順序。並べ替えをオフにしていても、"2" や "10" のような整数形のキーは JavaScript のオブジェクトの規則により先頭へ、数値の小さい順に移動します。並べ替えをオンにすると、この規則に関係なくすべてのキーを文字列として文字コード順(大文字が小文字より先、"10" が "2" より先)に並べて出力します。配列の中の順序は変えません。
エラーメッセージの読み方
メッセージはブラウザのエンジンが出す英文をそのまま表示します。最近の Chrome・Edge(V8)は「Expected ',' or '}' after property value in JSON at position 23 (line 4 column 3)」のように位置も書き、Firefox は「JSON.parse: expected ',' or '}' after property value in object at line 4 column 3 of the JSON data」という形式です。ツールはメッセージ中の「line L column C」または「position N」を探して行・列に変換します。V8 の「Unexpected token ']', "[1,2,3,]" is not valid JSON」のように位置を含まないメッセージでは、行・列は表示されません。
示される位置は「パーサーが読めなくなった場所」で、書き間違えた場所ではありません。3行目の末尾でカンマを落とすと、エラーは4行目のキーで報告されます。まず示された位置の直前を確認してください。
圧縮でどれだけ小さくなるか
id・name・active の3項目を持つオブジェクト1,000個の配列で実測しました(Node.js の zlib、既定設定)。2スペースのインデントで 67,282 バイト、圧縮版は 43,281 バイトで、生のサイズは36%減ります。ところが gzip を通すと 5,371 バイト対 5,106 バイトで差は約5%、Brotli では 2,493 対 2,245 バイトです。サーバーが gzip や Brotli で配信しているなら空白除去の効果は小さく、意味があるのは転送圧縮のない経路、保存容量、ログ1行に収めたい場合です。
例
カンマの付け忘れ
- 入力
{ "a": 1, "b": 2 "c": 3 }- 結果
構文エラー: Expected ',' or '}' after property value in JSON at position 23 (line 4 column 3)/位置: 4行 3列(Chrome の場合)
誤りは3行目の末尾(2 の後)ですが、エラーは4行目の "c" で報告されます。
64ビット ID が変わる例
- 入力
{"id":1050118621198921728,"id_str":"1050118621198921728"}- 結果
{ "id": 1050118621198921700, "id_str": "1050118621198921728" }
数値の id は下の桁が変わり、文字列の id_str はそのままです。JSON.parse はエラーを出さずに変えてしまう(このツールは警告を表示します)ので、大きな ID は文字列でやり取りする必要があります。
キーの並べ替え
- 入力
{"b":1,"10":2,"2":3,"a":4}- 結果
{ "10": 2, "2": 3, "a": 4, "b": 1 }
並べ替えはキーを文字列として比べるので、"10" が "2" より前に来ます(先頭の1が2より小さい)。並べ替えをオフにすると、整数形のキーは JavaScript のオブジェクトの規則どおり "2"、"10" の順で先頭に来ます。
使い方
- 入力欄に JSON を貼り付けます。
- インデント(スペース2・スペース4・タブ)とキー並べ替えの有無を選びます。
- 「フォーマット」か「圧縮」を押します。エラーが出たら、示された行・列の直前を確認します。
よくある質問
VS Code の設定ファイルを貼るとエラーになるのはなぜ?
コメントや末尾カンマが含まれているためだと考えられます。VS Code はこれを標準 JSON より緩い JSON with Comments として読みます。コメントと末尾カンマを消せば読み込めます。
JavaScript のオブジェクトをそのまま貼れますか?
{a: 1} のようなクォートなしのキー、シングルクォート、undefined、関数は JSON ではありません。ブラウザのコンソールで JSON.stringify(オブジェクト) を実行した結果を貼ってください。
0.1000 が 0.1 になりました。
解析した数値を書き出し直すためです。値は同じですが、桁の表記は保たれません。金額のように表記そのものが大事なら文字列で保存してください。
重複キーがあるのにエラーが出ません。
JSON.parse は重複キーをエラーにせず、最後の値を残します。前の値は結果から消えるので、元のデータと見比べてください。
エラーメッセージはブラウザで違いますか?
違います。文言も位置の書き方もエンジンが決めるため、Chrome と Firefox では表現が異なり、位置を示さないメッセージもあります。
出典
- RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format
- ECMA-404 The JSON data interchange syntax
- MDN: SyntaxError: JSON.parse: bad parsing
- VS Code: JSON editing (JSON with Comments)
- X Developer Platform: X IDs
基準日: