「JSONの文法くらい分かっている」と思っていたのですが、実際に新人のレビューをしていると"NaN"をそのまま値として書いてエラーになる、大きな整数がJavaScript側で丸められる、といった細かいハマりどころが次々に出てきました。分かっているつもりのルールほど、一度棚卸ししておく価値があると感じています。

JSONの値は6種類だけ

JSONの6種類の値(object・array・string・number・boolean・null)とネスト構造を示す図

図1: object と array だけがネストでき、残り4種類がその末端の値になる

JSONで表現できる値は、object・array・string・number・boolean・nullの6種類だけです。この少なさこそがJSONのシンプルさの源泉であり、逆に言えば、この6種類の使い方を正確に押さえれば構文エラーはほぼ防げます。

表記
object{ }{"id": 1, "name": "太郎"}
array[ ][1, 2, 3]
stringダブルクォートで囲む"hello"
numberクォート無し42, 3.14, -5
booleantrue / falsetrue
nullnullnull

object と array — 入れ子構造の作り方

objectとarrayは、内部に任意の値(他のobjectやarrayも含む)を持てるため、これらを組み合わせることで任意の深さのデータ構造を表現できます。

JSON — objectとarrayの組み合わせ例
{
  "project": "DevNotes",
  "members": [
    { "name": "あくろぽりす", "role": "Engineer" },
    { "name": "山田",       "role": "Reviewer" }
  ],
  "settings": {
    "theme": "dark",
    "notifications": {
      "email": true,
      "slack": false
    }
  }
}

objectのキーの並び順は仕様上は意味を持たない(順序を保証しない)とされている点にも注意が必要です。多くのパーサー実装は挿入順を保持しますが、「順序に依存したロジック」を組むのは避けるべきです。

string — クォートとエスケープのルール

文字列は必ずダブルクォートで囲みます。シングルクォートは使えません。また、文字列内に特殊文字を含める場合はバックスラッシュでエスケープする必要があります。

エスケープ意味
\"ダブルクォート
\\バックスラッシュ
\n改行
\tタブ
\uXXXXUnicodeコードポイント(例: → 日)

⚠️ Windowsのパス文字列でよくあるミス

"path": "C:\Users\name" のように、バックスラッシュをエスケープせずに書くと構文エラーになります。JSONに書く場合は "path": "C:\\Users\\name" のように必ず\\とダブルにするか、スラッシュ区切り "C:/Users/name" に置き換えてください。

number — 実務で誤解しやすい数値表現

numberはクォート無しで書きますが、いくつか実務で見落としやすい制約があります。

  • 先頭の0は不可01 のような表記はエラー。0.5のように小数点前の単独の0は可
  • NaN / Infinity は使えない — JavaScriptでは存在する値だが、JSON仕様には無い。数値として表現できない場合はnullや文字列で代替する
  • 非常に大きな整数は丸められることがある — JavaScriptのnumber型はIEEE754倍精度浮動小数点のため、2^53を超える整数は誤差が生じる。ID等の大きな数値は文字列で表現するAPI設計も多い

💡 大きなIDを文字列で返すAPI設計の例

Twitter(X)APIやSnowflake形式のIDを採用するサービスの多くは、"id": "1234567890123456789"のように大きな数値をあえて文字列として返します。数値のまま返すと、言語やパーサーによって精度が失われる可能性があるためです。

よくある構文エラー早見表

誤った例正しい例原因
{"a": 1, "b": 2,}{"a": 1, "b": 2}末尾カンマ
{'a': 1}{"a": 1}シングルクォート使用
{a: 1}{"a": 1}キーのクォート漏れ
{"a": undefined}{"a": null}undefinedは非対応
{"a": 01}{"a": 1}先頭の0
// comment(削除する)標準JSONはコメント非対応

これらのミスはツールがほぼ全て検出してくれる

PART 02で紹介したVS CodeのJSON言語機能やjqのemptyコマンドを使っていれば、このページの誤った例はすべて赤い波線や終了コードエラーとして即座に検出されます。ルールを覚えることと、ツールに検出させることの両方が重要です。

まとめ

JSONの値は6種類だけというシンプルさが強みですが、そのシンプルさゆえに「多少緩くても動く」他形式とは違い、ルール違反には厳格です。今回整理したポイントを押さえておけば、手打ち編集時の事故はかなり減らせます。

次の章では…

PART 04 では、複数の値をどう組み合わせてネスト構造を設計するか、そしてJSON Schemaによってその構造を機械的に検証する方法を解説します。

→ PART 04 — 構造設計とJSON Schemaへ