読み込み中...
プログラミングを学んでいると、必ず出会うのがJSON(ジェイソン)です。
「なんとなく見たことあるけど、ちゃんと理解していない...」という方も多いのではないでしょうか。
この記事では、JSONの基本ルールから実際のコードでの使い方まで、初心者の方にもわかりやすく丁寧に解説します。この記事を読み終えるころには、JSONを自信を持って読み書きできるようになります。
JSON = JavaScript Object Notation(ジャバスクリプト・オブジェクト・ノーテーション)
名前に「JavaScript」と入っていますが、JavaScriptだけのものではありません。Python、Java、Go、Ruby、PHPなど、ほぼすべてのプログラミング言語で使える、世界標準のデータ形式です。
データをテキストで表現するための書き方のルールです。
たとえば、「田中太郎さん、25歳、東京在住」という情報をJSONで書くと、こうなります:
1{
2 "name": "田中太郎",
3 "age": 25,
4 "city": "東京"
5}人間が読んでも意味がわかるし、プログラムでも簡単に処理できる。これがJSONの大きな特徴です。
JSONは、現代のプログラミングであらゆる場面に登場します。具体的には以下のような場面です。
Webサービスからデータを取得すると、ほとんどの場合JSONが返ってきます。天気予報API、SNSのAPI、AIのAPIなど、すべてJSONです。
package.json --- Node.jsプロジェクトの設定ファイルtsconfig.json --- TypeScriptの設定ファイルsettings.json --- エディタの設定ファイルプログラム間でデータをやりとりするときの「共通語」として使われます。フロントエンド(ブラウザ)とバックエンド(サーバー)の通信でも、JSONが標準です。
OpenAI APIやClaude APIに送るリクエストも、返ってくるレスポンスも、すべてJSON形式です。バイブコーディングをする上でも、JSONの理解は欠かせません。
JSONにはいくつかの厳密なルールがあります。ここをしっかり押さえておけば、エラーに悩まされることが大幅に減ります。
波括弧 `{}` で囲み、「キー: 値」のペアを書きます。
1{
2 "name": "田中太郎",
3 "age": 25,
4 "isStudent": false
5}")で囲む:)で区切る,)で区切る角括弧 `[]` で囲み、値をカンマ区切りで並べます。
1{
2 "fruits": ["りんご", "バナナ", "みかん"],
3 "scores": [85, 92, 78]
4}配列の中にオブジェクトを入れることもできます:
1{
2 "users": [
3 { "name": "田中", "age": 25 },
4 { "name": "鈴木", "age": 30 },
5 { "name": "佐藤", "age": 22 }
6 ]
7}JSONで使えるデータ型は、以下の6つだけです。
| データ型 | 例 | 説明 |
|---|---|---|
| 文字列(string) | "こんにちは" | ダブルクォートで囲む |
| 数値(number) | 42, 3.14 | 整数・小数どちらもOK |
| 真偽値(boolean) | true, false | すべて小文字 |
| null | null | 「値がない」を表す。小文字 |
| オブジェクト(object) | { "key": "value" } | 波括弧で囲む |
| 配列(array) | [1, 2, 3] | 角括弧で囲む |
JSONでは文字列やキーに使えるのはダブルクォート(`"`)だけです。
1// NG: シングルクォートは使えない
2{ 'name': 'Taro' }
3
4// OK: ダブルクォートを使う
5{ "name": "Taro" }Pythonではシングルクォートもダブルクォートも使えますが、JSONでは必ずダブルクォートです。ここは非常によく間違えるポイントです。
最後の要素のあとにカンマを付けてはいけません。
1// NG: 末尾カンマ
2{
3 "name": "田中",
4 "age": 25,
5}
6
7// OK: 末尾カンマなし
8{
9 "name": "田中",
10 "age": 25
11}JavaScriptやPythonでは末尾カンマが許されますが、JSONでは厳禁です。
JSONにはコメント機能がありません。
1// NG: コメントは書けない
2{
3 "name": "田中", // ユーザー名
4 "age": 25 /* 年齢 */
5}上の例は説明のために // NG と書いていますが、実際のJSONファイルにコメントを書くとエラーになります。どうしてもコメントを残したい場合は、次のようにダミーのキーを使うことがあります(あまり推奨されませんが)。
1{
2 "_comment": "これはユーザー情報です",
3 "name": "田中",
4 "age": 25
5}ただし、tsconfig.json や settings.json など一部のファイルは「JSONC」(JSON with Comments)形式で、コメントが許可されています。これはJSON本来の仕様ではなく、ツール側が独自に対応しているものです。
実際にどんなJSONが使われているか、具体例を見てみましょう。
1{
2 "location": {
3 "city": "東京",
4 "country": "日本"
5 },
6 "current": {
7 "temperature": 22.5,
8 "humidity": 65,
9 "description": "晴れ時々曇り",
10 "wind_speed": 3.2
11 },
12 "forecast": [
13 {
14 "date": "2026-02-23",
15 "high": 24,
16 "low": 15,
17 "description": "晴れ"
18 },
19 {
20 "date": "2026-02-24",
21 "high": 20,
22 "low": 12,
23 "description": "曇りのち雨"
24 }
25 ]
26}オブジェクトの中にオブジェクトがあったり、配列の中にオブジェクトがあったり、入れ子(ネスト)の構造になっています。最初は複雑に見えますが、一つずつ分解して読めば理解できます。
location --- 場所のオブジェクトcurrent --- 現在の天気のオブジェクトforecast --- 予報の配列(複数日分のオブジェクトが並んでいる)1{
2 "id": 12345,
3 "username": "tanaka_taro",
4 "email": "taro@example.com",
5 "profile": {
6 "display_name": "田中太郎",
7 "bio": "Webエンジニア3年目。Pythonが好きです。",
8 "avatar_url": "https://example.com/avatars/12345.png"
9 },
10 "settings": {
11 "language": "ja",
12 "theme": "dark",
13 "notifications": true
14 },
15 "tags": ["Python", "Web", "AI"],
16 "created_at": "2025-04-15T10:30:00Z"
17}AIを使ったことがある方は、こんなJSONを見たことがあるかもしれません。
1{
2 "id": "chatcmpl-abc123",
3 "object": "chat.completion",
4 "created": 1709000000,
5 "model": "gpt-4o",
6 "choices": [
7 {
8 "index": 0,
9 "message": {
10 "role": "assistant",
11 "content": "JSONとは、データを構造的に表現するためのテキスト形式です。"
12 },
13 "finish_reason": "stop"
14 }
15 ],
16 "usage": {
17 "prompt_tokens": 15,
18 "completion_tokens": 30,
19 "total_tokens": 45
20 }
21}AIのレスポンスも、すべてJSONで返ってきます。choices[0].message.content に実際の回答テキストが入っているのが読み取れるでしょうか。このようにJSONの構造がわかれば、APIの結果から必要なデータを取り出す方法が理解できます。
Pythonには標準ライブラリに json モジュールが用意されています。追加のインストールは不要です。
APIからJSONの文字列を受け取ったとき、Pythonの辞書(dict)に変換します。
1import json
2
3# JSON文字列
4json_string = '{"name": "田中太郎", "age": 25, "city": "東京"}'
5
6# JSON文字列 → Python辞書
7data = json.loads(json_string)
8
9print(data["name"]) # 田中太郎
10print(data["age"]) # 25
11print(type(data)) # <class 'dict'>json.loads() の s は「string(文字列)」の意味です。文字列を読み込む(load)ので loads です。
逆に、Pythonの辞書をJSON文字列に変換します。
1import json
2
3# Python辞書
4data = {
5 "name": "田中太郎",
6 "age": 25,
7 "city": "東京"
8}
9
10# Python辞書 → JSON文字列
11json_string = json.dumps(data)
12print(json_string)
13# {"name": "\u7530\u4e2d\u592a\u90ce", "age": 25, "city": "\u6771\u4eac"}日本語が \uXXXX のようにエスケープされてしまいました。これを防ぐには ensure_ascii=False を指定します。
1json_string = json.dumps(data, ensure_ascii=False)
2print(json_string)
3# {"name": "田中太郎", "age": 25, "city": "東京"}indent を指定すると、改行とインデント付きで見やすく出力できます。
1json_string = json.dumps(data, ensure_ascii=False, indent=2)
2print(json_string)出力:
1{
2 "name": "田中太郎",
3 "age": 25,
4 "city": "東京"
5}デバッグやログ出力のときにとても便利です。
ファイルに保存されたJSONを読み込むには json.load()(s なし)を使います。
1import json
2
3# JSONファイルを読み込む
4with open("data.json", "r", encoding="utf-8") as f:
5 data = json.load(f)
6
7print(data["name"])loads は文字列から、load はファイルから、と覚えましょう。
Pythonのデータをファイルに保存するには json.dump()(s なし)を使います。
1import json
2
3data = {
4 "name": "田中太郎",
5 "age": 25,
6 "scores": [85, 92, 78]
7}
8
9# JSONファイルに書き出す
10with open("output.json", "w", encoding="utf-8") as f:
11 json.dump(data, f, ensure_ascii=False, indent=2)これで output.json というファイルに、整形されたJSONが保存されます。
| メソッド | 方向 | 対象 |
|---|---|---|
json.loads() | JSON文字列 → Python辞書 | 文字列(string) |
json.dumps() | Python辞書 → JSON文字列 | 文字列(string) |
json.load() | JSONファイル → Python辞書 | ファイル(file) |
json.dump() | Python辞書 → JSONファイル | ファイル(file) |
s が付くかどうかで、文字列かファイルかが決まります。
JavaScriptではさらに簡単にJSONを扱えます。専用のグローバルオブジェクト JSON が最初から用意されています。
1const jsonString = '{"name": "田中太郎", "age": 25}';
2
3const data = JSON.parse(jsonString);
4
5console.log(data.name); // 田中太郎
6console.log(data.age); // 251const data = {
2 name: "田中太郎",
3 age: 25,
4 city: "東京"
5};
6
7const jsonString = JSON.stringify(data);
8console.log(jsonString);
9// {"name":"田中太郎","age":25,"city":"東京"}
10
11// 見やすく整形する場合(第3引数にインデント幅を指定)
12const pretty = JSON.stringify(data, null, 2);
13console.log(pretty);JSON.stringify の第2引数は変換対象のフィルタ(通常は null)、第3引数はインデント幅です。
JavaScriptのオブジェクトとJSONは見た目が似ていますが、別のものです。
1// JavaScript のオブジェクト(JSONではない)
2const obj = { name: "田中", age: 25 };
3
4// JSON 文字列(文字列であることに注意)
5const json = '{"name": "田中", "age": 25}';JavaScriptのオブジェクトではキーにクォートが不要ですが、JSONでは必ずダブルクォートが必要です。
PythonでJSONを扱うとき、最もハマりやすいのがJSONとPython辞書の微妙な違いです。変換時に自動で切り替わりますが、自分で書くときに混同しやすいポイントをまとめます。
| 項目 | JSON | Python |
|---|---|---|
| 真(true) | true | True |
| 偽(false) | false | False |
| 空値(null) | null | None |
| 文字列のクォート | " のみ | " でも ' でもOK |
| 末尾カンマ | 禁止 | 許可 |
| キーの型 | 文字列のみ | 文字列以外もOK |
| コメント | 不可 | # で可能 |
1import json
2
3# NG: Pythonの書き方をそのままJSON文字列にしてしまう
4bad_json = "{'name': 'Taro', 'active': True, 'data': None}"
5# json.loads(bad_json) # エラーになる!
6
7# OK: 正しいJSON
8good_json = '{"name": "Taro", "active": true, "data": null}'
9data = json.loads(good_json)
10print(data)
11# {'name': 'Taro', 'active': True, 'data': None}json.loads() を使えばJSON → Pythonの変換は自動で行われます(true → True、null → None)。しかし、自分でJSON文字列を手書きするときは、JSONのルールに従う必要があります。
JSONを扱うときにつまずきやすいポイントを、エラーメッセージと一緒に紹介します。
1import json
2
3# 末尾カンマがあるとエラー
4bad = '{"name": "田中", "age": 25,}'
5json.loads(bad)
6# json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes対処法: 最後の要素のあとのカンマを削除してください。
1import json
2
3# シングルクォートはJSONでは無効
4bad = "{'name': '田中'}"
5json.loads(bad)
6# json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes対処法: すべてのクォートをダブルクォートに変更してください。
1import json
2
3# Pythonの True/False/None はJSONでは無効
4bad = '{"active": True, "data": None}'
5json.loads(bad)
6# json.decoder.JSONDecodeError: Expecting value対処法: JSONでは true、false、null(すべて小文字)を使います。
1import json
2
3# 閉じ括弧が足りない
4bad = '{"name": "田中", "items": [1, 2, 3}'
5json.loads(bad)
6# json.decoder.JSONDecodeError: Expecting ',' delimiter対処法: 括弧の対応を確認してください。開き { と閉じ }、開き [ と閉じ ] の数が一致しているかチェックしましょう。
1import json
2
3# 数値がクォートで囲まれている(これ自体はエラーにならないが、意図と違う結果になる)
4data = json.loads('{"age": "25"}')
5print(data["age"] + 1)
6# TypeError: can only concatenate str (not "int") to str対処法: 数値はクォートで囲まず、そのまま書きます。"25" は文字列、25 は数値です。
JSONのエラーに遭遇したら、以下の手順で確認しましょう。
1. エラーメッセージの行番号・位置を確認する --- JSONDecodeError にはエラーの位置が含まれています
2. 括弧の対応を確認する --- {} と [] の数を数える
3. カンマの位置を確認する --- 末尾カンマがないか、カンマの抜けがないか
4. クォートを確認する --- シングルクォートになっていないか
5. オンラインツールでバリデーションする --- 次のセクションで紹介するツールを使う
JSONを扱うときに役立つツールを紹介します。
ブラウザで使えるオンラインツールです。JSONを貼り付けると、自動で整形・検証してくれます。
VS Codeを使っているなら、追加のツールなしでJSONの整形ができます。
1. .json ファイルを開く
2. Shift + Alt + F(Windows)/ Shift + Option + F(Mac)で自動整形
ターミナルからJSONを整形したいときは、Pythonのワンライナーが便利です。
1echo '{"name":"田中","age":25}' | python -m json.tool出力:
1{
2 "name": "田中",
3 "age": 25
4}python -m json.tool は標準ライブラリの機能なので、追加インストールなしで使えます。
コマンドラインでJSONを扱うなら、jq というツールが非常に強力です。
1# インストール(Mac)
2brew install jq
3
4# 整形して表示
5echo '{"name":"田中","age":25}' | jq .
6
7# 特定の値を取り出す
8echo '{"name":"田中","age":25}' | jq .name
9# "田中"APIのレスポンスを確認するときなどに活躍します。
JSONはテキストでデータを表現するための世界標準のフォーマットです。API通信、設定ファイル、データ保存など、プログラミングのあらゆる場面で使われています。
1{
2 "文字列": "ダブルクォートで囲む",
3 "数値": 42,
4 "小数": 3.14,
5 "真偽値_true": true,
6 "真偽値_false": false,
7 "空値": null,
8 "配列": [1, "二", true, null],
9 "オブジェクト": {
10 "入れ子": "もできる"
11 }
12}1. キーと文字列はダブルクォートで囲む
2. キーと値はコロンで区切る
3. 要素間はカンマで区切る(末尾カンマは禁止)
4. 使えるデータ型は6種類(文字列・数値・真偽値・null・オブジェクト・配列)
5. コメントは書けない
6. 真偽値は小文字(true / false)、空値も小文字(null)
| やりたいこと | コード |
|---|---|
| JSON文字列 → 辞書 | json.loads(json_string) |
| 辞書 → JSON文字列 | json.dumps(data, ensure_ascii=False) |
| 辞書 → 整形JSON文字列 | json.dumps(data, ensure_ascii=False, indent=2) |
| JSONファイル → 辞書 | json.load(open("file.json")) |
| 辞書 → JSONファイル | json.dump(data, open("file.json", "w"), ensure_ascii=False, indent=2) |
| やりたいこと | コード |
|---|---|
| JSON文字列 → オブジェクト | JSON.parse(jsonString) |
| オブジェクト → JSON文字列 | JSON.stringify(data) |
| オブジェクト → 整形JSON文字列 | JSON.stringify(data, null, 2) |
| JSON | Python |
|---|---|
true | True |
false | False |
null | None |
"string" | "string" または 'string' |
JSONは一度理解してしまえば、ずっと使い続ける基礎知識です。APIを叩くとき、設定ファイルを編集するとき、AIと連携するとき、必ず役に立ちます。
この記事で学んだルールを頭に入れておけば、JSONに関するエラーの大半は自力で解決できるようになるはずです。ぜひ実際にPythonやJavaScriptでJSONを書いて、手を動かしながら身につけてみてください。

AIを使ってWebアプリを作り、実際にインターネットに公開するまでの全体像をわかりやすく解説します。企画→開発→デプロイの流れ、使うツールや技術の選び方、初心者が陥りやすい落とし穴まで、バイブコーディング時代の開発プロセスを俯瞰できるコラムです。
無料
AIがコードを書いてくれる「Claude Code」を徹底解説。Claude Codeとは何か、何ができるのか、インストール方法から基本的な使い方まで、初心者にもわかりやすくステップバイステップで紹介します。バイブコーディングを始めたい方の最初の一歩に最適な無料講座です。
無料
Claude CodeなどのAI開発ツールを使うにはNode.jsが必要です。この無料講座では、Node.jsとは何か、なぜ必要なのかをわかりやすく解説し、Windows・Macそれぞれのインストール手順をステップバイステップで紹介します。npmの基本的な使い方も学べます。
無料
プログラミング初心者が最もつまずく「エラーメッセージ」を徹底攻略します。赤い文字や英語の羅列に怯える必要はもうありません。この無料講座では、Pythonのエラーメッセージの読み方を「下から上へ」のシンプルなルールで解説し、よく出る10大エラーの原因と対処法を具体的なコード例とともに紹介します。エラーを「敵」から「味方」に変えて、バイブコーディングをもっとスムーズに進めましょう。
無料