JSONのチェックでは「読み取れるか」と「そのまま伝わるか」の両方を確認します
JSONは、RFC 8259とECMA-404が定める文法に従ったテキストです。オブジェクトは波括弧 { }、配列は角括弧 [ ] で囲み、キーと文字列はダブルクォートで囲みます。値に使えるのは、文字列・数値・true・false・null・オブジェクト・配列だけです。この規則から1文字でも外れると、受け取る側のプログラムはドキュメント全体を読み込めません。JavaScriptの JSON.parse は、末尾のカンマが1つあるだけでも、シングルクォートが1つあるだけでもSyntaxErrorになります。
このチェッカーは、貼り付けたテキストを標準の文法どおりに厳密に読み取ります。文法が誤っていれば、解析が止まった行と列、その前後の行、閉じられていない括弧が開かれた位置を表示します。手作業で編集した設定ファイルや他の言語からコピーしたテキストによくある表記(コメント・末尾のカンマ・シングルクォート・引用符のないキー・Trueなど)は、自動でまとめて修正できます。文法が正しければ、折りたためるツリーで構造を表示します。値を選ぶと、その値までのパスと、値が占めるサイズも確認できます。
文法が正しくても、受け取るプログラムで値が変わることがあります。同じキーが2回出てくると、多くの場合は前の値が失われます。9007199254740993のような大きな整数は、JavaScriptでは9007199254740992として読み取られます。こうした箇所はエラーとは区別して、下の「注意」の一覧に別途まとめます。
JSONを検査して展開して確認したい場面
- APIのレスポンスを確認するとき: レスポンスが1行に長く連なって返ってくると、どの値がどこにあるのか分かりにくいものです。貼り付けるとツリーに展開され、必要な値をクリックして
$.items[2].priceのようなパスをそのままコピーできます。 - 設定ファイルを編集した後: package.json、tsconfig.json、VS Codeの設定のように手で編集するファイルは、カンマが1つ抜けただけでプログラムが起動しなくなります。保存する前に貼り付けてみれば、何行目なのかがすぐに分かります。tsconfig.jsonのようにコメントを許可するファイルを別のツールに渡すときは、自動修正でコメントを取り除いたコピーを作れます。
- ログやチャットからコピーしたJSON: メッセンジャーや文書エディタを経由すると、引用符が丸い引用符に変わったり、Webページの特殊な空白が混ざったり、Pythonの出力のようにシングルクォートやTrueが入っていたりします。目では区別できないこうした文字を、位置とあわせて指摘します。
- レスポンスが重い原因を探すとき: サイズマップは、選んだオブジェクトや配列の配下にある値ごとのバイト数を、面積で描きます。サムネイルをbase64で入れたフィールドや、同じ内容が繰り返される配列のように、サイズを押し上げている箇所が一目で分かります。
- ほかのシステムへ送る前に: 注文番号やツイートIDのような大きな整数、同じオブジェクト内の重複キー、対になっていない絵文字のエスケープは、文法チェックだけでは見つかりませんが、受け取る側で値が変わります。注意の一覧で事前に確認してください。
使い方
- 原文の欄にJSONを貼り付けるか、「ファイルを開く」またはドラッグ&ドロップで.jsonファイルを開きます。入力が止まるとすぐに検査が始まり、Ctrl+Enter(Macは⌘+Enter)で即座に再検査することもできます。
- エラーがある場合は、下にエラー診断と自動修正が表示されます。ステータス行の「エラー位置へ」を押すと、原文の欄のその文字にカーソルが移動します。自動で修正できる表記だけであれば、「N か所を修正して原文に反映」で一度に直せます。結果が気に入らなければ、ステータス行の「元に戻す」を押してください。
- 文法が正しければ、左側のツリーで値を選びます。三角形のクリックやダブルクリックで枝を展開・折りたたみでき、矢印キーでも移動できます。原文の欄でカーソルを動かすと、ツリーもその値に追従します。
- 右側の確認パネルで、パスの表記(JSONPath・JavaScript・Python・jq・JSON Pointer)を選び、「パスをコピー」を押します。「値をコピー」は、選んだ値だけを2スペースのインデント付きJSONでコピーします(文字列は引用符を除いた文字そのものです)。
- 原文の欄の下にあるボタンで、2スペース・4スペースでの整形や1行への圧縮ができ、コピーや.jsonファイルとしての保存も行えます。整形するとき、数値は書いたとおりの表記を保ち、重複キーも削除しません。
エラーの案内と直し方
表の入力例をこのチェッカーに入れると、中央の列の案内が表示されます。位置は、解析が止まった文字を指します。カンマが抜けている場合だけは、止まった位置ではなく、カンマが入るべき位置、つまり直前の値のすぐ後を指します。行末でカンマを書き忘れるミスが最も多く、次の行の先頭文字よりも前の行の末尾を示すほうが原因を見つけやすいためです。
| 入力例 | このチェッカーの案内 | 直し方 |
|---|---|---|
[1, 2, 3,] | 最後の要素の後にカンマがあります | 閉じ括弧の前のカンマを削除します |
{"a": 1 "b": 2} | 要素の間にカンマが抜けています | 1のすぐ後にカンマを入れます |
{'a': 1} | 文字列はダブルクォートで囲む必要があります | 'a' を "a" に置き換えます |
{a: 1} | ダブルクォートのないキーです: a | キーを "a" のように囲みます |
{"a": 1, /* メモ */ "b": 2} | JSONにはコメントを書けません | コメントを削除します |
{"ok": True} | JSONの値ではなく、Pythonの表記です: True | 小文字のtrueで書きます |
{"avg": NaN} | JSONにない値です: NaN | nullまたは文字列に置き換えます |
{"zip": 04001} | 数値の先頭に0を付けることはできません: 04001 | "04001" のように文字列で書きます |
["1行目↵2行目"] | 文字列の途中で改行されています | 改行を \n と書きます |
{"path": "C:\Users\misaki"} | JSONにないエスケープです: \U | バックスラッシュを \\ と2つ重ねて書きます |
{"data": [1, 2 | ドキュメントが終わりましたが、閉じられていない括弧があります | 途中で切れていないか確認し、ここで終わりなら ]} を付けます |
{"a": 1}↵{"a": 2} | JSONの値が終わった後に、文字が続いています | 配列にまとめるか、JSONLとして扱います |
{“a”: 1} | まっすぐな引用符ではなく、丸い引用符です: “ | まっすぐなダブルクォート " に置き換えます |
ドキュメントが終わっても括弧が開いたままの場合は、診断に「末尾に必要な閉じ文字」が内側から表示されます。{"data": [1, 2 であれば ]} です。ただし、ログや画面からコピーする途中で切れたレスポンスは、後半のデータが欠けた状態です。括弧だけを足して文法を整えるより、元のレスポンスを取得し直すほうが適切です。
自動修正が書き換えるものと書き換えないもの
自動修正は、JSON5・JSONCのような拡張形式、PythonやJavaScriptのコード、文書エディタを経由して生じた表記を、標準のJSONに書き換えます。行の配置とインデントはそのままで、該当する文字だけを置き換えます。コメントだけの行は、行ごと削除します。修正結果をもう一度厳密に検査し、通った場合にだけ「N か所を修正して原文に反映」のボタンが表示されます。修正できる表記があっても別のエラーが残る場合は、ボタンの代わりに、そのエラーを先に直すよう案内します。
| 修正する表記 | 入力 | 自動修正の結果 |
|---|---|---|
| コメント | {"a": 1 /* メモ */} | {"a": 1 } |
| 末尾のカンマ | [1, 2, 3,] | [1, 2, 3] |
| 抜けているカンマ | {"a": 1 "b": 2} | {"a": 1, "b": 2} |
| シングルクォートの文字列 | {'name': 'it\'s'} | {"name": "it's"} |
| 丸い引用符 | {“name”: “美咲”} | {"name": "美咲"} |
| 引用符のないキー | {name: "美咲", 2024: true} | {"name": "美咲", "2024": true} |
| Pythonの値・大文字の値 | [True, False, None, NULL] | [true, false, null, null] |
| NaN・Infinity・undefined | [NaN, Infinity, -Infinity, undefined] | [null, null, null, null] |
| +1・.5・5.・0x1Fの数値 | [+1, .5, 5., 0x1F] | [1, 0.5, 5.0, 31] |
| 文字列内の改行・タブ | ["1行目↵2行目", "a→b"] | ["1行目\n2行目", "a\tb"] |
| 特殊な空白(NBSP) | {"a":⍽1} | {"a": 1} |
| 先頭のBOM | [BOM]{"a": 1} | {"a": 1} |
NaN・Infinity・undefinedをnullに変えるのは、意味が変わる修正です。JSONの数値には無限大もNaNもないため、標準の範囲で使える位置はnullだけです。ただし、受け取るプログラムが「値なし」と「NaN」を区別する必要があるなら、文字列に置き換えるほうが適しています。16進数は、2⁵³−1を超えない場合にだけ10進数に変換します。
次のものは、あえて修正しません。先頭に0が付いた数値(04001)は、郵便番号のように文字列であるべきか、数値であるべきかが判断できません。カンマが重なった [1,,2] は、空の値を入れるつもりだったのかが分からず、途中で切れたドキュメントは、欠けた内容を復元できません。1行に1オブジェクトずつ書くJSONLは、修正する対象ではなく別の形式なので、JSON配列↔JSONL変換ツールを使ってください。 同じ行でカンマが抜けた配列の要素([1 -2]、["a" "b"])も直しません。Python や JavaScript では引き算や文字列の連結になり、カンマを入れると意味が変わるためです。カンマを補うのは、改行をまたぐ箇所とオブジェクトのキーの前だけです。
パスの表記5種類
ツリーで値を選ぶと、その値までのパスを5種類の表記で表示します。同じ値でも、使う場面によって表記が異なります。JSONPathはPostmanなどのAPIテストツールやデータベースのクエリに、JavaScriptとPythonの表記はコードに、jqはコマンドラインに、JSON PointerはJSON Patch(RFC 6902)やJSON Schemaの $ref に使います。JavaScriptとPython表記の data は、JSONを読み込んで入れた変数の名前だと考えてください。
| JSONPath | JavaScript | Python | jq | JSON Pointer |
|---|---|---|---|---|
$.items[2].options.gift_wrap | data.items[2].options.gift_wrap | data["items"][2]["options"]["gift_wrap"] | .items[2].options.gift_wrap | /items/2/options/gift_wrap |
$.headers['x-request-id'] | data.headers["x-request-id"] | data["headers"]["x-request-id"] | .headers["x-request-id"] | /headers/x-request-id |
$.住所.都市 | data.住所.都市 | data["住所"]["都市"] | .["住所"]["都市"] | /住所/都市 |
$['a/b']['m~n'] | data["a/b"]["m~n"] | data["a/b"]["m~n"] | .["a/b"]["m~n"] | /a~1b/m~0n |
$ | data | data | . | 空文字列 |
ドット(.)で書けるキーの範囲は、表記ごとに異なります。JSONPathの標準(RFC 9535)は、英字とアンダースコアに加えてU+0080以上の文字もドット表記で書けるので、日本語のキーも $.住所.都市 と書けます。jqでドットが使えるのは、英数字とアンダースコアのキーだけです。そのため、日本語やハイフンを含むキーは .["住所"] のように角括弧で囲みます。JavaScriptは識別子の規則に従うので、日本語のキーはドットで、x-request-id のようにハイフンを含むキーは角括弧で書きます。JSON Pointerはキーを / でつなぐため、キーの中の ~ は ~0 に、/ は ~1 に置き換えます。ドキュメント全体を指すときは空文字列です。
文法は正しくても値が変わるケース
大きな数値。 JSONの文法は数値の桁数に上限を設けていません。ただしRFC 8259は、多くのプログラムが数値をIEEE 754 binary64(倍精度浮動小数点数)で扱うため、整数は−(2⁵³−1)から2⁵³−1までの範囲でしか、どこでも同じ値で読み取れないと記しています。それより大きな整数や、有効数字が長すぎる小数は、最も近いbinary64の値に変わります。このチェッカーは、書かれた文字と読み取られた値の有効数字を比較し、値が変わる数値だけを注意として表示します。
| JSONに書いた数値 | JavaScriptが読み取る値 | このチェッカー |
|---|---|---|
9007199254740991 | 9007199254740991 | そのまま(安全に扱える最大の整数) |
9007199254740993 | 9007199254740992 | 精度の損失 |
1234567890123456789 | 1234567890123456800 | 精度の損失 |
0.1234567890123456789 | 0.12345678901234568 | 精度の損失 |
1.10 | 1.1 | そのまま(同じ値。整形するときも書いたとおりの表記を保持) |
1e400 | Infinity | 範囲を超える数値(Pythonではinf) |
1e-400 | 0 | 0になる数値 |
注文番号や会員番号のように計算に使わない大きな整数は、"1234567890123456789" のように文字列でやり取りするのが安全です。RFC 7493(I-JSON)も、binary64より広い範囲や精度が必要な数値は、文字列で表すよう勧めています。
重複キー。 RFC 8259は、1つのオブジェクト内のキーは一意であるべき(SHOULD)と定めています。そのうえで、重なったときは最後の値だけを使うプログラム、エラーにするプログラム、すべて渡すプログラムがあり、動作を予測できないと記しています。JavaScriptの JSON.parse とPythonの json は、後ろの値を採用します。このチェッカーは、重複キーをエラーにせず注意として表示します。ツリーでそのキーを選ぶと、先に出てきた同じキーへ移動するボタンが表示されます。
対のないサロゲート。 絵文字のようにU+FFFFを超える文字は、\ud83d\ude00 のように、2つのエスケープで1組になります。途中で切れて \ud83d だけが残ると、文法は通るものの、UTF-8に変換できない文字になります。その結果、受け取る側で文字化けしたり、エラーになったりします。I-JSONは、こうした文字を認めていません。
BOM。 メモ帳のようなエディタは、ファイルの先頭にBOM(U+FEFF)を付けることがあります。RFC 8259は、JSONを送信するときにBOMを付けてはならない(MUST NOT)とし、読み取る側は無視してもよい(MAY)としています。ところが、JavaScriptの JSON.parse とPythonの json.loads(文字列入力)は、BOMをエラーとして扱います。このチェッカーはBOMを読み飛ばして処理しますが、注意として表示し、整形・圧縮した結果からは取り除きます。
キーの順序。 JSONオブジェクトのキーの順序には意味がないと考えるのが原則ですが、人が読むときは書いた順序が大切です。JavaScriptのオブジェクトは、"2024" のように整数の形をしたキーを、ほかのキーより前に並べます(ECMAScriptのOrdinaryOwnPropertyKeys)。そのため、このチェッカーはブラウザの JSON.parse を使わず、独自の解析器で、書いた順序のままツリーを描きます。
サイズマップの見方
サイズマップは、選んだオブジェクトや配列の直下にある値ごとに、原文で占めるUTF-8のバイト数を測り、その分の面積で分割した図です。オブジェクトの場合は、キー名と値、その間の空白まで数えます。大きいものから正方形に近い形で配置し、最大30マスまで描きます。全体の0.4%に満たない小さな値は、斜線入りの「その他」の1マスにまとめます。マスの色は、ツリーの文字色と同じ種類別の色(オブジェクト・配列・文字列・数値・真偽値・null)です。
マスをクリックするとその値が選択され、オブジェクトや配列であればツリーが展開されて、マップも1段階内側に入ります。上部の位置表示(全体 › items › 0)をクリックすると、外側に戻ります。例の「注文APIのレスポンス」では、商品が3つ入ったitemsが最も大きく、その中に入るとオプションの多い商品がより大きく表示されます。実際のレスポンスでは、base64で入れた画像、毎回繰り返される長い説明、使っていないデバッグ用のフィールドが、大きなマスとして目立つことがよくあります。
間違えやすいケース
- JavaScriptのオブジェクトをJSONだと思い込む: コードに書いた
{name: 'a', list: [1, 2,],}はJavaScriptでは正しいものの、JSONではありません。キーと文字列をダブルクォートで囲み、末尾のカンマを削除する必要があります。自動修正は、この3つを一度に処理します。 - Pythonの出力をそのままコピーする:
print(dict)の結果は、{'ok': True, 'x': None}のようにシングルクォートとTrue・Noneを使います。JSONが必要なときはjson.dumps()で出力してください。すでにコピーしてしまった場合は、自動修正で直せます。 - Windowsのパスのバックスラッシュ:
"C:\Users"の\UはJSONのエスケープではないため、エラーになります。"C:\\Users"のように2つ重ねるか、"C:/Users"のようにスラッシュを使ってください。\nや\tで始まるフォルダ名は、エラーにならずに改行やタブに変わるので、さらに注意が必要です。 - 数値と数字に見える文字列:
42と"42"、falseと"false"は別の値です。ツリーでは、数値は紫、文字列は引用符付きの茶色で表示されるので、型が意図どおりか確認できます。 - JSONLを1つのドキュメントとして検査する: ログファイルのように1行に1オブジェクトずつ書いたテキストは、最初のオブジェクトの後で「JSONの値が終わった後に、文字が続いています」というエラーになります。1行ずつ検査するか、配列に変換してください。
- 文法チェックの通過をデータの検証だと思い込む:
{"age": -5}や{"date": "2026-02-30"}は、正しいJSONです。必須キー・値の範囲・日付の実在は、JSON Schemaや受け取るシステムの検証で確認する必要があります。
制限と注意点
- 入力は5 MB(5,242,880バイト)まで検査できます。ファイルは、UTF-8(BOM付きを含む)とUTF-16のBOM付きファイルを読み取ります。ネストは500段階まで読み取ります。
- ツリーは一度に3,000行まで描画し、要素が多い配列は200個ずつ「次の…件を表示」で展開します。検索は、最初の10,000件まで数えます。
- 列番号はコードポイントで数えます。絵文字のようにUTF-16で2単位を使う文字も1列として数えるため、位置をUTF-16単位で数えるブラウザのエラーメッセージの「position」とは異なる場合があります。
- 自動修正は表記だけを書き換えます。NaN・Infinityをnullに変えるように意味が変わる修正もあるため、一覧を確認してから使ってください。先頭が0の数値、重なったカンマ、途中で切れたドキュメントは修正しません。
- JSON Schemaの検証、2つのJSONの比較、キーの並べ替えは行いません。インデントの整形と圧縮をさらに詳しく扱うには、JSON整形・圧縮ツールを使ってください。
出典
- 01IETF — RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format§2 文法、§4 名前は一意であるべき(SHOULD)、§6 binary64と±(2⁵³−1)の相互運用性、§8.1 BOMを付けないこと・読み取り時は無視してよい、§8.2 対のないサロゲート — 2026-10-22確認
- 02Ecma International — ECMA-404: The JSON data interchange syntaxJSON文法の標準(空白はタブ・改行・復帰・スペースの4種類)
- 03IETF — RFC 7493: The I-JSON Message Format§2.1 サロゲート・非文字の禁止、§2.2 binary64を超える数値は文字列を推奨、§2.3 重複する名前の禁止(MUST NOT)
- 04IETF — RFC 9535: JSONPath: Query Expressions for JSON§2.5.1.1 member-name-shorthand(英字・アンダースコア・U+0080以上の文字)、シングルクォート・ダブルクォートの名前セレクタ
- 05IETF — RFC 6901: JavaScript Object Notation (JSON) Pointer/でつなぐパス、~は~0・/は~1、空文字列はドキュメント全体
- 06jq Manual.fooは英数字とアンダースコアのキーのみ、それ以外のキーは ."foo" または .["foo"]
- 07Pythonドキュメント — json: JSON encoder and decoder「Repeated Names Within an Object」: 同じ名前は最後の値だけが残る、NaN・Infinityを既定で受け入れる
- 08The JSON5 Data Interchange Format§1.1 JSONにない拡張: コメント、末尾のカンマ、シングルクォート、識別子のキー、16進数、前後の小数点、+記号、NaN・Infinity
- 09MDN — JSON.parse()末尾のカンマとシングルクォートはSyntaxError
- 10MDN — Number.MAX_SAFE_INTEGERJavaScriptが正確に表せる最大の整数 2⁵³−1 = 9,007,199,254,740,991
- 11ECMAScript Language Specification — OrdinaryOwnPropertyKeys§10.1.11.1 配列インデックスの形をしたキーを数値順に先頭へ並べる
よくある質問
エラーの行・列が、実際に間違っている場所と違うのはなぜですか?
表示される位置は、解析器がそれ以上読めずに止まった場所です。カンマが抜けている場合は、カンマが入るべき位置、つまり直前の値のすぐ後を示します。一方、閉じ引用符が抜けると、文字列が次の行まで続き、その先で止まります。エラー診断に表示される前後の行と、「開いた括弧・文字列が始まった位置」をあわせて見ると、原因を見つけやすくなります。
自動修正は、どのような表記を直しますか?
コメント、末尾のカンマ、行の間で抜けたカンマ、シングルクォートと丸い引用符の文字列、引用符のないキー、True・False・Noneと大文字のTRUE・NULL、NaN・Infinity・undefined(→ null)、+1・.5・5.・0x1Fのような数値、文字列内の改行・タブ、特殊な空白、先頭のBOMの12種類です。行の配置はそのままで該当する文字だけを置き換え、修正結果が再び厳密な検査を通る場合にだけボタンが表示されます。
コメント付きのJSONCやJSON5のファイルも検査できますか?
このチェッカーは標準のJSON(RFC 8259)を基準に検査するため、コメントと末尾のカンマはエラーとして表示します。そのかわり、自動修正でコメント・末尾のカンマ・シングルクォート・引用符のないキーを取り除いた標準のJSONを作れます。元のファイルをJSONCのまま使い続ける場合は、修正結果を、ほかのプログラムに渡すコピーとして使ってください。
大きな数値が9007199254740992のように変わるのはなぜですか?
JavaScriptをはじめ多くのプログラムは、JSONの数値をIEEE 754 binary64の浮動小数点数として読み取ります。この形式が正確に表せる整数は±(2⁵³−1)、つまり9,007,199,254,740,991までです。それより大きな整数や、有効数字が17桁を超える小数は、最も近い値に変わります。このチェッカーは、値が変わる数値を、「JavaScriptが読み取る値」とともに注意の一覧に表示します。識別番号の場合は、文字列で渡すほうが安全です。
同じオブジェクトに同じキーが2回あると、どうなりますか?
RFC 8259は、キーは一意であるべき(SHOULD)と定めているだけで、重なったときの動作はプログラムごとに異なると記しています。JavaScriptのJSON.parseとPythonのjsonは後ろの値を採用し、前の値を捨てます。このチェッカーは文法エラーにはせず注意として表示し、ツリーと整形結果には両方の値を残します。
JSONPathとjqのパスは、どう違いますか?
JSONPath(RFC 9535)は$で始まり、$.items[0].nameのように書きます。日本語のようなASCII以外の文字も、ドット表記で書けます。jqは.で始まり、.items[0].nameのように書きますが、ドット表記が使えるのは英数字とアンダースコアのキーだけです。日本語やハイフンを含むキーは.["キー"]と書きます。JSON Pointer(RFC 6901)は/items/0/nameのように/でつなぎ、~は~0に、/は~1に置き換えます。
サイズマップの大きさは、何を基準にしていますか?
選んだオブジェクトや配列の直下にある値ごとに、原文で占めるUTF-8のバイト数(キー名と値の中の空白を含む)を測り、面積に割り当てます。大きいものから最大30個を描き、ごく小さい残りは「その他」の1マスにまとめます。APIのレスポンスが重い理由や、どの配列がサイズを占めているかを探すときに使ってください。
入力したJSONは、サーバーに送信されたり保存されたりしますか?
いいえ。貼り付けたテキストと開いたファイルは、このブラウザ内だけで検査・変換され、サーバーへの送信も保存もされません。アドレスにも内容を含めないので、トークンや個人情報を含むレスポンスを検査した後は、タブを閉じるか「クリア」を押してください。