Web API のレスポンス、フロントエンドの設定ファイル、ログ出力、ブラウザの開発者ツール——とにかくJSONを目にしない日はないと言っていいほど、現代の開発でJSONは「共通言語」となりました。
ですが「読めばわかる」と感じる一方で、いざ自分で書こうとすると {} や [] をどう使い分けるか、末尾カンマが付けられるのか、改行はどう扱うか、と意外と迷うポイントが多いフォーマットでもあります。この記事では、構造の基本から実務で押さえておきたい使い分け・整形のコツ・他フォーマットとの違いまで、ひととおり整理します。
JSONとは — JavaScript由来の軽量データフォーマット
JSON(JavaScript Object Notation)は、その名のとおりJavaScriptのオブジェクトリテラルを起源とするデータフォーマットです。Douglas Crockford が2000年代初頭に「JavaScript の構文の一部だけを取り出し、言語非依存のデータ交換フォーマットとして使う」という形で広め、いまや RFC 8259 として標準化されています。
最大の特徴はシンプルさです。データ型は文字列・数値・真偽値・null・配列・オブジェクトの6種類だけで、ほぼすべての言語にネイティブ相当のパーサがあります。テキストとして読みやすく、生のままでもなんとなく構造が伝わるという「人間にも機械にも優しい」点が普及の理由です。
基本構造 — 6つの型をおさえれば全部書ける
JSON の値(value)は次の6種類のいずれかです。
- 文字列(string):
"hello"。必ずダブルクォートで囲む。シングルクォートはNG。 - 数値(number):
42、3.14、-1.5e10。整数と浮動小数点の区別はなく、NaN や Infinity は使えない。 - 真偽値(boolean):
trueまたはfalse。小文字限定。 - null:「値がない」状態を表す。
- 配列(array):
[1, 2, 3]。順序のあるリスト。中身は何の型でもよく、混在も可能。 - オブジェクト(object):
{ "name": "Alice", "age": 30 }。キー(必ず文字列)と値のペアの集合。
これだけです。これらの組み合わせで、入れ子になった複雑なデータ構造も表現できます。
よく使われる組み合わせパターン
配列の中にオブジェクト(リスト)
Web API のレスポンスで最頻出のパターン。同じ構造のレコードを並べます。
[ { "id": 1, "name": "りんご" }, { "id": 2, "name": "みかん" } ]
オブジェクトの中に配列(マスター+リスト)
親オブジェクトに、子要素のリストをぶら下げる構造。
{ "user": "Alice", "tags": ["admin", "editor"] }
深いネスト(ツリー構造)
オブジェクトの中にオブジェクト、その中にまた配列、というように何階層にもなるパターン。柔軟ですが、深すぎると扱いづらくなるため、3〜4階層を超えるなら設計を見直すサインです。
JSONの厳格なルール(つまずきポイント)
JavaScriptのオブジェクトリテラルと「似ているけど少し違う」点が、JSONの落とし穴です。
キーは必ずダブルクォートで囲む
JavaScriptではキーに引用符が要りませんが、JSONでは必須です。
- NG:
{ name: "Alice" } - OK:
{ "name": "Alice" }
末尾カンマ(trailing comma)は禁止
JavaScript(ES5以降)ではOKですが、JSONではエラーになります。
- NG:
[1, 2, 3,] - OK:
[1, 2, 3]
コメントは書けない
// も /* */ も使えません。設定ファイルでどうしてもコメントが必要なら、JSON5・JSONC(VS Code式)といった JSON のスーパーセット形式を使う必要があります。
文字列内のエスケープ
文字列内では \ でエスケープします。代表的なものは以下です。
\"— ダブルクォート\\— バックスラッシュ\n— 改行\t— タブ\uXXXX— Unicode コードポイント
数値の制限
NaN、Infinity、-Infinity は JSON では表現できません。これらが必要なら、文字列にするか null で代用するかを判断する必要があります。
整形(pretty print)— 読むときは整形・送るときは圧縮
実務でのJSONには「人が読むための形」と「機械が処理するための形」の2つがあり、用途で使い分けます。
整形版(インデント付き)
改行とインデント(通常2スペースまたは4スペース)を入れて、構造が一目でわかる形式。デバッグ時や仕様書に貼り付けるときはこちら。
圧縮版(minified)
改行や空白をすべて除去した形式。Web APIのレスポンスや、HTTPボディに乗せて転送するときはこちら。データサイズが小さくなり、通信効率が上がります。
本サイトの JSON整形ツール なら、貼り付け→整形/圧縮の切替がワンクリックで、構文エラーの位置も即座に教えてくれます。
よくあるJSONエラーと直し方
パーサがエラーを返したときの代表的な原因です。位置情報(line: 5, column: 12 など)と一緒に確認しましょう。
- Unexpected token:末尾カンマ、シングルクォート、コメントを書いた、など。
- Unexpected end of input:閉じカッコ
}や]が足りない。 - Bad string escape:文字列内の
\の使い方ミス。Windows パス"C:\Users\..."のような書き方は、JSON 内では"C:\\Users\\..."とさらにエスケープが必要。 - Duplicate key:同じキーが複数回あるオブジェクト。RFCでは禁止されていないが、多くのパーサで予期せぬ動作になる。
他のフォーマットとの使い分け
JSON vs XML
XMLは1990年代後半から広く使われたフォーマットで、属性・名前空間・スキーマ(XSD)・XSL変換など、機能が非常に豊富です。代わりに冗長で、人間が手書きするのは大変。Web APIの世界では2010年前後にJSONがほぼ完全に置き換えました。SOAP・古いエンタープライズ系・XMPP・SVG など、特定領域ではいまもXMLが現役です。
JSON vs YAML
YAML は JSON のスーパーセットで、インデントで構造を表現します。設定ファイル用途(Kubernetes、Docker Compose、GitHub Actions など)で広く使われ、人間が手書きするのに優しい一方、インデント1個のズレでエラーになる繊細さ、文字列の自動型推論による事故(yes が真偽値の true に化ける、など)が課題です。機械間の交換は JSON、人が書き換える設定は YAMLが大まかな住み分けです。
JSON vs TOML
TOML は Rust の Cargo や Python の pyproject.toml で使われる、INIファイル風の人間向けフォーマットです。YAMLのインデント問題に懲りた人が好む傾向にあり、設定ファイル用途では年々シェアを伸ばしています。
実務でよく使われる JSON の場面
- REST API のリクエスト/レスポンス:いまや業界標準。Content-Type は
application/json。 - 設定ファイル:package.json、tsconfig.json、.eslintrc.json など。
- ログ出力(JSON Lines):1行1レコードで JSON を出力する形式。構造化ログの定番。grep や jq での処理がしやすい。
- ブラウザの localStorage:文字列しか保存できないので、
JSON.stringifyで文字列化してから保存するのが慣例。 - JWT(JSON Web Token):認証トークンのペイロード部分が JSON(Base64 で包まれている)。
JSON を扱うときの実用テクニック
jq — コマンドラインの強力な味方
ターミナルで JSON を整形・抽出・変換できるツール。curl ... | jq . でAPIレスポンスをそのまま整形表示できます。jq の文法は独特ですが、覚えると一生もの。
JavaScript なら JSON.parse / JSON.stringify
ブラウザにも Node.js にも標準で入っている関数で、文字列⇔オブジェクトの相互変換が可能。JSON.stringify(obj, null, 2) でインデント付き出力ができます。
大きすぎる JSON への対処
数十MB以上の JSON を一度にパースすると、メモリ不足や処理時間の問題が起きます。そういう時は JSON Lines(1行1レコード) 形式に変換するか、ストリーミングパーサ(Node なら stream-json、Python なら ijson)を使うのが定番です。
セキュリティ上の注意点
- eval() で JSON をパースしない:古いコードで稀に見かける書き方。任意のコード実行になり危険。必ず
JSON.parseを使う。 - プロトタイプ汚染に注意:JSON のキーに
__proto__やconstructorが含まれると、JavaScript のオブジェクトをマージする処理(Object.assign、ライブラリの deep merge)で意図しないグローバル変更が起きる可能性。 - 非常に深いネストでスタック溢れ:パーサに大量の
{{{{...を渡すと再帰でクラッシュすることがある。外部入力には深度制限を。
まとめ — JSONは「読めるが、書くと意外と落とし穴」
JSON はシンプルだからこそ、わずかな構文エラーで全体が壊れます。手書きする際は、エラーを即座に教えてくれる整形ツールに通すクセを付けるだけで、ハマる時間が劇的に減ります。
本サイトの JSON整形ツール はブラウザ完結で、貼り付けた瞬間に整形+エラー検出をしてくれます。手軽な検証用にぜひどうぞ。