JSONとは何か?データ構造と基本ルールをわかりやすく解説
JSONは、データをやり取りしやすい形で文字として表すためのフォーマットです。APIのレスポンス、設定ファイル、NoSQL系のデータ保存、JavaScriptやPythonでのデータ受け渡しまで、実務ではかなり広い場面で使われます。
難しく見えますが、まず押さえるべき点はシンプルです。JSONは「オブジェクト」と「配列」を土台にして、文字列・数値・真偽値・nullを組み合わせて表現します。つまり、名前付きのデータをまとめたいときはオブジェクト、順番のある一覧を持ちたいときは配列と考えると理解しやすくなります。
- JSONはデータ交換用のテキスト形式
- 使える値は
文字列数値true/falsenullオブジェクト配列 - キーは必ずダブルクォーテーションで囲む
- 末尾カンマは不可
- JavaScriptのオブジェクトに似ているが、同じものではない
ここがポイント: JSONは「プログラムそのもの」ではなく、「データを安全に受け渡すための書式」です。
JSONで何ができるのか
JSONが便利なのは、システムやツールの間で同じ形のデータを渡しやすいからです。
たとえば次のような場面で使います。
- Web APIから商品一覧やユーザー情報を受け取る
- アプリの設定値をファイルに保存する
- JavaScriptとバックエンドの間でデータをやり取りする
- CSVよりも入れ子構造のあるデータを扱う
CSVは表形式には強い一方で、「ユーザーごとに複数の注文を持つ」のような構造になると表現が窮屈です。JSONなら、1人のユーザーの中に住所、連絡先、注文履歴をまとめて持たせる、といった形を自然に書けます。
JSONの基本構造
JSONでまず覚えるべき構造は2つです。
オブジェクト
オブジェクトは、キー: 値 の組み合わせをまとめる形です。
{
"name": "Masa",
"age": 30,
"is_member": true
}
この例では、name age is_member がキーです。人や商品、設定項目のように、意味の違う属性をひとまとめにしたいときに向いています。
配列
配列は、値を順番に並べる形です。
[
"red",
"blue",
"green"
]
一覧データや履歴、複数レコードの返却でよく使います。
オブジェクトと配列を組み合わせる
実務では、ほとんどの場合この2つを組み合わせます。
{
"user": {
"id": 101,
"name": "Masa"
},
"orders": [
{
"id": "A001",
"total": 1200
},
{
"id": "A002",
"total": 3500
}
]
}
この形なら、「1人のユーザー」と「そのユーザーの注文一覧」をひとつのデータとして渡せます。APIレスポンスで非常によく見る構造です。
JSONで使える値の種類
RFC 8259では、JSONで表せる値は次の6種類に整理されています。
- 文字列
- 数値
- 真偽値
truefalse null- オブジェクト
- 配列
文字列
文字列は必ずダブルクォーテーションで囲みます。
{
"message": "hello"
}
シングルクォーテーションはJSONでは使えません。
数値
数値はそのまま書きます。
{
"price": 1980,
"rate": 0.15
}
ただし、JSONでは数値の書き方にも制約があります。
01のような先頭ゼロは不可NaNは不可Infinityは不可
JavaScriptでは扱えても、JSONとしては無効になる値がある点は見落としやすいところです。
真偽値
真偽値は小文字の true false を使います。
{
"active": true,
"deleted": false
}
null
値が空であることを明示したいときは null を使います。
{
"middle_name": null
}
未設定なのか、空文字なのか、0なのかを区別したい場面で意味があります。
JSONの基本ルール
JSONは見た目がシンプルなぶん、ルール違反があるとすぐに読み込みに失敗します。初心者がつまずきやすい点を先に整理しておきます。
キーは必ずダブルクォーテーション
{
"name": "Masa"
}
次のような書き方は、JavaScriptのオブジェクトでは許されてもJSONとしては無効です。
{ name: "Masa" }
文字列もダブルクォーテーション
{
"city": "Tokyo"
}
'Tokyo' はJSONでは使えません。
末尾カンマは入れない
無効な例です。
{
"name": "Masa",
"age": 30,
}
配列でも同じです。
[
1,
2,
3,
]
エディタによっては見逃しやすいので注意が必要です。
コメントは書けない
JSONにはコメント構文がありません。
{
"port": 8080
}
設定ファイルでコメントを書きたい場合は、JSONではなくYAMLやTOMLが向くことがあります。
JSONとJavaScriptオブジェクトの違い
名前が似ているので混同されがちですが、JSONとJavaScriptオブジェクトは同一ではありません。
主な違い
- JSONはデータ交換用の文字列形式
- JavaScriptオブジェクトはプログラム内のデータ構造
- JSONはキーを必ずダブルクォーテーションで囲む
- JSONでは関数を持てない
- JSONではコメントや
undefinedを使えない
たとえばJavaScriptでは次のようなオブジェクトが書けます。
const user = {
name: "Masa",
greet: function () {
return "hello";
},
score: undefined,
};
これはJavaScriptとしては有効ですが、JSONとしては無効です。JSONはあくまで「データ」だけを表す書式で、関数や実行可能な処理は含めません。
JSONの書き方を最小例で確認する
ここでは実務でそのまま見かける形に近い最小例を示します。
入力例
{
"id": 1001,
"name": "USB-C Hub",
"price": 3980,
"in_stock": true,
"tags": ["PC周辺機器", "USB-C"],
"manufacturer": {
"name": "Example Inc.",
"country": "JP"
}
}
何を表しているか
- 商品IDは
1001 - 商品名は
USB-C Hub - 在庫有無は
true - タグは配列で複数保持
- メーカー情報はオブジェクトでひとかたまりにしている
表形式のデータだけならCSVでも扱えますが、この例では「商品の基本情報」「複数タグ」「メーカー情報」が混ざっています。JSONのほうが構造を壊さずに扱いやすい典型例です。
JSONをプログラムで扱う基本
JSONは読むだけでなく、実際にはコードで読み書きして使います。
JavaScriptで読み込む
JSON.parse() を使うと、JSON文字列をJavaScriptの値に変換できます。
const text = '{"name":"Masa","age":30}';
const data = JSON.parse(text);
console.log(data.name);
// Masa
JavaScriptで書き出す
JSON.stringify() を使うと、オブジェクトをJSON文字列に変換できます。
const user = {
name: "Masa",
age: 30,
};
const jsonText = JSON.stringify(user);
console.log(jsonText);
// {"name":"Masa","age":30}
APIに送信するとき、ローカル保存するとき、ログとして構造化して出したいときによく使います。
Pythonで読み込む
Pythonでは標準ライブラリの json モジュールを使います。
import json
text = '{"name": "Masa", "age": 30}'
data = json.loads(text)
print(data["name"])
# Masa
Pythonで書き出す
import json
user = {
"name": "Masa",
"age": 30
}
print(json.dumps(user, ensure_ascii=False))
# {"name": "Masa", "age": 30}
ensure_ascii=False を付けると、日本語を \uXXXX 形式ではなく読みやすい形で出しやすくなります。
実務での使いどころ
JSONは学習用の概念ではなく、普段の業務に直結します。
APIレスポンス
たとえば顧客情報APIが次のようなJSONを返すとします。
{
"customer_id": 501,
"name": "Suzuki",
"points": 120,
"rank": "gold"
}
この形式なら、フロントエンドは name や points をそのまま画面表示に使えます。バックエンド側でも言語を問わずパースしやすく、システム間のやり取りが揃えやすくなります。
設定ファイル
開発環境やツール設定でもJSONはよく使われます。項目名が明確で、機械的に読みやすいからです。
{
"port": 3000,
"debug": true,
"logLevel": "info"
}
複数メンバーで扱う設定ファイルでは、書式が厳密なぶん差分確認しやすい利点もあります。
ログやデータ整形
ログをJSONで出しておくと、後でフィルタや集計がしやすくなります。
- エラーコードで絞り込む
- ユーザーIDごとに追跡する
- BIツールやログ基盤に流し込む
ただの文章ログより、後工程で扱いやすいのが強みです。
よくある失敗とNG例
ここは実務で詰まりやすいところです。
NG1: シングルクォーテーションを使う
{
'name': 'Masa'
}
これはJSONとして無効です。必ずダブルクォーテーションを使います。
NG2: コメントを書く
{
"name": "Masa"
// user name
}
コメントを入れたい気持ちは自然ですが、JSONではエラーになります。
NG3: 末尾カンマを残す
{
"name": "Masa",
"age": 30,
}
整形ツールを使わず手で編集すると起きやすいミスです。
NG4: JavaScriptの値をそのまま書く
{
"score": NaN,
"value": undefined
}
NaN や undefined はJSONでは使えません。
JSONで困ったときの確認ポイント
JSONが読み込めないときは、まず次を見れば原因が絞りやすくなります。
- キーと文字列がダブルクォーテーションになっているか
- 末尾カンマが残っていないか
- コメントを書いていないか
truefalsenullが小文字かNaNInfinityundefinedを入れていないか- 配列
[]とオブジェクト{}の閉じ忘れがないか
エラー文が短くても、原因はこのどれかであることがかなり多いです。
JSON以外の形式との使い分け
JSONが万能というわけではありません。用途に応じて他の形式と分けると判断しやすくなります。
CSVとの違い
- CSV: 表形式に強い
- JSON: 入れ子構造や配列を自然に持てる
売上一覧のような単純な表ならCSVで十分です。一方で、1レコードの中に複数の子要素を持つならJSONのほうが向いています。
YAMLとの違い
- YAML: 人が読み書きしやすい
- JSON: 機械処理で壊れにくく、仕様がシンプル
設定ファイルを手で頻繁に触るならYAMLが便利なことがあります。ただし、インデント依存で崩れやすい場面もあるため、機械処理中心ならJSONのほうが扱いやすいケースは多いです。
まずはこの形が読めれば十分
初心者のうちは、次の形が読めれば実務の入口としてかなり十分です。
{
"users": [
{
"id": 1,
"name": "Sato"
},
{
"id": 2,
"name": "Suzuki"
}
]
}
ここで押さえることは3つです。
- 外側はオブジェクト
usersの値は配列- 配列の中にユーザーオブジェクトが並んでいる
この読み方に慣れると、API仕様書や設定ファイルを見たときの抵抗感がかなり減ります。
まとめ
JSONは、構造化されたデータをテキストで安全にやり取りするための基本フォーマットです。覚えることは多く見えても、実際に重要なのは「オブジェクト」「配列」「6種類の値」「厳密な書式」の4点です。
最後に、実務でまず意識したい要点を絞ると次のとおりです。
- APIや設定ファイルではJSONを読めることが前提になりやすい
- キーと文字列はダブルクォーテーション
- コメント、末尾カンマ、
undefinedは使えない - 入れ子構造を素直に表せるのがJSONの強み
次に見るべきポイントは、JSONを読むだけでなく、JSON.parse() や JSON.stringify()、Pythonの json.loads() json.dumps() で実際に触ってみることです。そこまで進むと、API連携やデータ整形の記事も一気に理解しやすくなります。
