TegaruTools
開発者ガイド

JSON 完全入門|構造・整形・実務で迷わない使い分け

API・設定ファイル・ログ — どこでも見かけるJSONの基礎を、構文・整形のコツ・よくあるエラー・他フォーマット (XML/YAML/TOML) との比較まで、実務目線で網羅します。

公開: 2026年6月17日読了 約9TegaruTools

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)423.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 コードポイント

数値の制限

NaNInfinity-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整形ツール はブラウザ完結で、貼り付けた瞬間に整形+エラー検出をしてくれます。手軽な検証用にぜひどうぞ。

この記事で紹介したツール

関連するガイド記事