「JSONの文法くらい分かっている」と思っていたのですが、実際に新人のレビューをしていると"NaN"をそのまま値として書いてエラーになる、大きな整数がJavaScript側で丸められる、といった細かいハマりどころが次々に出てきました。分かっているつもりのルールほど、一度棚卸ししておく価値があると感じています。
JSONの値は6種類だけ
図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 |
| boolean | true / false | true |
| null | null | null |
object と array — 入れ子構造の作り方
objectとarrayは、内部に任意の値(他のobjectやarrayも含む)を持てるため、これらを組み合わせることで任意の深さのデータ構造を表現できます。
{
"project": "DevNotes",
"members": [
{ "name": "あくろぽりす", "role": "Engineer" },
{ "name": "山田", "role": "Reviewer" }
],
"settings": {
"theme": "dark",
"notifications": {
"email": true,
"slack": false
}
}
}
objectのキーの並び順は仕様上は意味を持たない(順序を保証しない)とされている点にも注意が必要です。多くのパーサー実装は挿入順を保持しますが、「順序に依存したロジック」を組むのは避けるべきです。
string — クォートとエスケープのルール
文字列は必ずダブルクォートで囲みます。シングルクォートは使えません。また、文字列内に特殊文字を含める場合はバックスラッシュでエスケープする必要があります。
| エスケープ | 意味 |
|---|---|
\" | ダブルクォート |
\\ | バックスラッシュ |
\n | 改行 |
\t | タブ |
\uXXXX | Unicodeコードポイント(例: 日 → 日) |
⚠️ 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によってその構造を機械的に検証する方法を解説します。