JSONとは何か
JSON(JavaScript Object Notation)は、データを人間にも機械にも読み書きしやすい形式で表現するためのテキストフォーマットだ。1999年頃にDouglas Crockfordが提案し、2013年にIETF RFC 7159として標準化。現在はRFC 8259が最新の仕様となっている。
名前に「JavaScript」が入っているが、JSONはJavaScriptに限らない。Python、PHP、Ruby、Go、Javaなど、あらゆる言語でパースライブラリが存在する言語非依存のフォーマットだ。WebAPIのレスポンス、設定ファイル(package.json、tsconfig.jsonなど)、データベースのドキュメント形式(MongoDBなど)——至る所で顔を出す。
JSONが広く使われる理由
- テキストベースで人間が読める(XMLより簡潔)
- あらゆるプログラミング言語でパースライブラリが存在する
- ネストした構造(オブジェクト・配列)を自然に表現できる
- 仕様がシンプルでパース処理が高速
- HTTPリクエスト/レスポンスのContent-Typeとして標準的に使われている
Point
JSONは「JavaScript Object Notation」だが、JavaScriptのオブジェクトリテラルと完全に同じではない。たとえばJavaScriptでは末尾カンマやコメントが許可されるが、JSONでは一切許可されていない。この違いがエラーの温床になる。
JSONの基本構文
JSONは6種類のデータ型と、2種類のコンテナ(オブジェクト・配列)で構成される。これを押さえておけば、エラーの大半はその場で原因を特定できる。
データ型一覧
| 型 | 記法 | 例 |
|---|---|---|
| 文字列(String) | ダブルクォートで囲む | "Hello, World!" |
| 数値(Number) | 整数・小数・指数表記 | 42 / 3.14 / 1e5 |
| 真偽値(Boolean) | 小文字のみ | true / false |
| null | 小文字のみ | null |
| オブジェクト(Object) | 波括弧 + キー:値のペア | {"name": "田中"} |
| 配列(Array) | 角括弧 + カンマ区切りの値 | [1, 2, 3] |
正しいJSONの例
オブジェクトのルール
-
キーは必ずダブルクォートで囲む
JavaScriptと異なり、JSONのオブジェクトのキーは必ずダブルクォートが必要。
{"name": "value"}はOK、{name: "value"}はエラーになる。 -
キーと値はコロン(:)で区切る
キーと値の間は必ずコロン。等号(=)は使えない。
-
複数のキー:値ペアはカンマ(,)で区切る
最後のペアの後にカンマを付けてはいけない(末尾カンマ禁止)。
文字列のエスケープ
文字列内でダブルクォートや特殊文字を使う場合は、バックスラッシュでエスケープする必要がある。WindowsのファイルパスをJSONに直接貼り付けると高確率でここでつまずく。
| エスケープシーケンス | 意味 |
|---|---|
\" | ダブルクォート |
\\ | バックスラッシュ |
\/ | スラッシュ(省略可) |
\n | 改行 |
\r | キャリッジリターン |
\t | タブ |
\uXXXX | Unicode文字 |
よくあるJSONエラーと原因
JSONの仕様はシンプルだ。シンプルだからこそ、ちょっとした書き間違いが即エラーになる。現場で繰り返し遭遇するパターンをNG例・OK例で見ていく。
エラー1: 末尾カンマ(Trailing Comma)
現場で最もよく見るエラーがこれだ。JavaScriptオブジェクトやPythonの辞書型では末尾カンマがOKなので、つい同じ感覚でJSONに書いてしまう。ここがハマりどころの筆頭。
注意
VS CodeはデフォルトでJSON末尾カンマを自動除去しない。ESLintの jsonc/no-dupe-keys やJSON拡張機能を入れれば保存時に自動修正できるので、チームで使うなら設定しておくといい。ちなみに tsconfig.json や VS Codeの settings.json はJSONC(JSON with Comments)という拡張フォーマットで、末尾カンマもコメントも書ける。標準JSONとは別物なので混同に注意。
エラー2: シングルクォートの使用
JSONの文字列はダブルクォート(")だけが正解。シングルクォート(')は使えない。JavaScriptに慣れているほど引っかかる罠だ。
エラー3: コメントの記述
JSONは // も /* */ もサポートしていない。「APIのURL変えた」「この値は秒数」といったメモをJSON設定ファイルに書きたくなる気持ちはわかるが、標準JSONでは即構文エラーだ。
Point
コメントが必要な場面では、 "_comment": "APIのベースURL" のようにアンダースコアプレフィックスのキーを使う慣習がある。ただしこれは普通のデータとして扱われる点に注意。コメントが本当に必要なら JSONC か YAML に切り替えるのが正解だ。
エラー4: undefined・NaN・Infinity
JavaScriptには undefined、NaN、Infinity という値があるが、JSONではいずれも使えない。特に厄介なのが JSON.stringify() の挙動で、undefined はキーごと消え、NaN や Infinity は黙って null に変換される。気づかずAPIに送り続けているケースが意外と多い。
エラー5: 数値の誤記
JSONの数値には先頭ゼロ(01 など)を付けられない。16進数(0xFF)、8進数(0o77)も同様にNG。「数値のつもりがダブルクォートで囲まれている」という文字列化ミスも地味によく出る。
エラー6: 不正なエスケープシーケンス
バックスラッシュを含む文字列では、未定義のエスケープシーケンスを使うとエラーになる。Windowsのファイルパスをそのまま貼り付けると C:\Users\tanaka の \U が不正シーケンスと判断されてアウト。これはWindowsユーザーの定番ハマりポイントだ。
エラー7: 文字コードの問題
JSON仕様はUTF-8エンコーディングを推奨(RFC 8259では必須)している。ファイルをShift-JISやEUC-JPで保存するとパーサーによっては文字化けやエラーが発生する。エディタのエンコーディング設定はUTF-8(BOMなし)に統一しておくこと。
JSON整形の方法
APIレスポンスが1行に圧縮されたJSONで返ってきたとき、素の状態では何が何だかわからない。整形(プリティプリント)すればインデントと改行が入り、ネスト構造が一目でわかる。デバッグ速度が全然違う。
ブラウザのデベロッパーツールで整形
実は追加ツール不要で使えるのがブラウザのDevToolsだ。ChromeもFirefoxもNetworkタブのPreviewが自動整形してくれるので、APIのレスポンスチェックならこれが一番速い。
-
DevToolsを開く
F12キー(またはCmd+Option+I)でDevToolsを開き、「Network」タブを選択。
-
APIリクエストを選択
画面を操作してAPIを呼び出し、Networkタブに表示されたリクエストの中からJSONを返すものをクリック。
-
「Preview」タブで確認
右パネルの「Preview」タブを開くとツリー形式で整形済みのJSONが表示される。「Response」タブで生のレスポンスも確認可能。
コマンドライン(jq)で整形
jq はJSONを扱うコマンドラインの定番ツールだ。整形だけでなく、フィルタリング・変換・集計まで対応している。curlと組み合わせればAPIのレスポンスを確認しながら開発する速度が劇的に上がる。
Node.jsのREPLで整形
エディタ(VS Code)で整形
VS Codeは .json ファイルに対してフォーマット機能をビルトインで持っている。
- Shift+Alt+F(Windows)/ Shift+Option+F(Mac) でフォーマット実行
- 右クリックメニューから「ドキュメントのフォーマット」も選択可
- settings.jsonに
"editor.formatOnSave": trueを追加すると保存時に自動整形 - Prettierプラグインを導入するとより詳細な整形ルールを設定できる
Pythonで整形
JSONバリデーションの方法
「このJSONが正しい構文か」「期待するデータ構造になっているか」を検証するのがバリデーション。構文チェック(シンタックスバリデーション)とスキーマバリデーションの2段階に分かれる。前者は誰でも使うが、後者まで実装しているプロジェクトは意外と少ない。
JavaScriptでの構文チェック
エラーメッセージの読み方
| エラーメッセージ(例) | 原因 | 確認箇所 |
|---|---|---|
| Unexpected token , in JSON at position X | 末尾カンマ / 余分なカンマ | position X の前後 |
| Unexpected token ' in JSON at position X | シングルクォートの使用 | 文字列の囲み文字を確認 |
| Unexpected end of JSON input | 括弧の閉じ忘れ / 文字列の終端なし | 末尾の括弧・クォートを確認 |
| Unexpected token u in JSON at position 0 | undefined が入っている | 値に undefined がないか確認 |
| Unexpected non-whitespace character after JSON | JSON終了後に余分な文字がある | 末尾の余分な文字を削除 |
ツールで効率化
エラーメッセージの「position X」は0始まりの文字インデックス。長いJSONだと何行目のどの位置か見当がつかないため、オンラインのJSON整形ツールに貼り付ければ行番号付きでエラー箇所を視覚的に確認できる。
JSON Schema入門
JSON Schemaは「このJSONはどういうデータ構造であるべきか」をJSON自身で定義する仕組みだ。型チェック、必須フィールドの確認、値の範囲制限といった細かいバリデーションルールを全部JSONで書ける。APIの仕様書として導入しておけば、フロントとバックで「思ってたのと違う」という齟齬が格段に減る。
JSON Schemaの基本構造
主要なキーワード一覧
| キーワード | 型 | 説明 |
|---|---|---|
type |
全般 | データ型(string / number / integer / boolean / array / object / null) |
required |
object | 必須プロパティ名の配列 |
properties |
object | 各プロパティのスキーマ定義 |
minLength / maxLength |
string | 文字列の最小・最大長 |
minimum / maximum |
number | 数値の最小・最大値 |
pattern |
string | 正規表現によるフォーマット検証 |
enum |
全般 | 許可する値のリスト |
items |
array | 配列の各要素のスキーマ |
format |
string | フォーマット(email / date / uri など) |
JavaScriptでJSON Schemaを使う(ajv)
APIレスポンスのデバッグ手順
Web開発の現場でREST APIのJSONレスポンスに悩む機会は多い。「パースできない」「値が想定と違う」「そもそも何も返ってこない」——原因の切り分けを体系的にやるかどうかで、解決時間が大きく変わる。
ステップ1: レスポンスの生データを確認する
ステップ2: よくある原因を確認する
-
Content-Typeヘッダーを確認
Content-Type: application/jsonが返ってこない場合、サーバー側の設定ミスの可能性がある。HTMLのエラーページが返ってきてJSONパースに失敗するケースも多い。 -
BOM(バイトオーダーマーク)の確認
一部のサーバーはBOM付きUTF-8でJSONを返す。レスポンス先頭に
\uFEFFが含まれるとパースエラーになるので、text.replace(/^\uFEFF/, '')で除去する。 -
文字化けの確認
日本語を含むJSONでは文字コードの問題が起こりやすい。レスポンスヘッダーの
charsetを確認し、必要ならTextDecoderで明示的にデコードする。 -
JSONPやコールバック形式の確認
レガシーなAPIでは
callback({"data": ...})というJSONP形式で返すことがある。純粋なJSONではないのでパースエラーになる。
curlでAPIのデバッグ
ツールで効率化
Postman(無料)やInsomnia(無料)などのAPIクライアントツールを使えば、GUIでリクエストを組み立て、レスポンスを自動整形して確認できる。繰り返しテストが必要な開発では手放せないツールだ。
JSON整形ツールの使い方
ToolShare LabのJSON整形ツールは、ブラウザ上で即座に整形・検証できる。登録不要で、データはすべてブラウザ内で完結するためサーバーには一切送信されない。APIキーや個人情報を含むJSONを貼り付けるときも安心して使える。
主な機能
- 整形(プリティプリント) — 圧縮されたJSONをインデント付きで読みやすく展開
- 圧縮(ミニファイ) — 空白・改行を除去してファイルサイズを削減
- バリデーション — 構文エラーをリアルタイムで検出、エラー箇所をハイライト
- ツリー表示 — 階層構造をビジュアルで確認
- コピー — 整形済みJSONをワンクリックでクリップボードにコピー
使い方の手順
-
JSONを貼り付ける
テキストエリアにJSONを直接貼り付ける。APIレスポンスのコピーでも、ファイル内容のペーストでもOK。
-
自動検証される
入力と同時にバリデーションが走り、エラーがあれば赤色でエラー内容と行番号を表示。構文が正しければ緑色の「有効なJSON」表示に切り替わる。
-
整形ボタンを押す
「整形」ボタンを押すとインデント(2スペースまたは4スペース)付きで整形される。インデント幅はオプションで変更可能。
-
コピーして使う
「コピー」ボタンで整形済みJSONをクリップボードにコピー。そのまま使いたいコードエディタや設定ファイルに貼り付けられる。
Point
圧縮JSONと整形JSONを使い分けると、本番環境(転送量を絞りたい)と開発環境(デバッグしやすくしたい)の両方に対応できる。ツールを使えばこの切り替えが数秒で終わる。わざわざIDEでインデントを手直しする時代ではない。