【2026年7月最新】Pythonのjson.loadsとjson.loadの違い!型変換の落とし穴と正しい使い方を完全解説
この記事の内容
「json.loadsとjson.loadって何が違うの?」「文字列型と辞書型で操作が変わって混乱する」——Pythonの初心者がJSONを扱おうとするとき、必ずと言っていいほどつまずくポイントです。
この記事では、Pythonのjson.loads・json.load・json.dumps・json.dumpの違いを完全解説します。型変換の仕組み・よくあるエラーの解決策・実際の業務での活用例まで網羅します。後半ではClaude CodeでJSONデータ処理を自動化する方法も解説します。
01 JSON BASICS JSONとは——Pythonで扱う前に知るべき基礎 テキストベースのデータ交換フォーマット。APIレスポンスの標準
📚 用語解説
JSON(JavaScript Object Notation):テキストベースのデータ交換フォーマット。元々はJavaScriptのオブジェクト記法がベースだが、現在はほぼ全てのプログラミング言語で利用できる。中括弧{}でオブジェクト、角括弧[]で配列を表現する。WebのAPIレスポンスの事実上の標準形式。人間にも読みやすいテキスト形式でデータを表現できる。
JSONはWebアプリケーション開発・データ連携・APIとの通信で最も普及したデータフォーマットです。Pythonで外部APIを呼び出すと、レスポンスはほぼ確実にJSON形式で返ってきます。
{
"name": "田中太郎",
"age": 30,
"email": "tanaka@example.com",
"hobbies": ["読書", "プログラミング", "旅行"],
"address": {
"city": "東京",
"zip": "100-0001"
},
"active": true
}
JSONの構造的な特徴:
02 LOADS VS LOAD json.loads vs json.load——最重要の使い分け sの有無が「文字列受取」か「ファイル受取」の違い
まず結論から:
| 関数 | 入力 | 用途 |
|---|---|---|
| json.loads() | 文字列(str) | APIレスポンス・変数として持っているJSONテキストを辞書に変換 |
| json.load() | ファイルオブジェクト(file) | JSONファイルを開いてその内容を辞書に変換 |
📚 用語解説
json.loads(loads = load string):sはstringの略。json.loads()は文字列をPythonのデータ型(主に辞書または配列)に変換(デシリアライズ)する関数。APIからのレスポンスや、変数に格納されたJSON形式の文字列を扱うときに使う。
2-1. json.loadsの使い方
import json
# 文字列として持っているJSONデータ
json_string = '{"name": "田中太郎", "age": 30, "active": true}'
# json.loadsで辞書型に変換
data = json.loads(json_string)
print(type(json_string)) # <class 'str'> ← 文字列型
print(type(data)) # <class 'dict'> ← 辞書型に変換された!
print(data["name"]) # 田中太郎
print(data["age"]) # 30
print(data["active"]) # True(JSONのtrueはPythonのTrueになる)
最もよく使うシナリオはWebAPIのレスポンス処理です:
import json
import urllib.request
# Web APIを呼び出す
url = 'https://api.example.com/users/1'
with urllib.request.urlopen(url) as response:
response_text = response.read().decode('utf-8') # バイト→文字列
user_data = json.loads(response_text) # 文字列→辞書
print(user_data['name']) # APIから取得したユーザー名
📚 用語解説
パース(Parse):テキストデータを解析してプログラムが扱えるデータ構造に変換する処理のこと。json.loadsでJSON文字列をPythonの辞書/リストに変換する操作は「JSONをパースする」と表現される。文字列を「意味のある構造」として読み取ることがパースの本質。JSONパース・XMLパース・HTMLパースなどがある。
json.loads()でAPIレスポンスをパースする際、受け取ったバイト列をまず文字列に変換(decode)してから渡す点に注意してください。urllib.request.urlopenは直接バイト列を返すため、response.read().decode('utf-8')→json.loads()の順番が必要です。
2-2. json.loadの使い方(ファイル読み込み)
📚 用語解説
json.load(ファイルオブジェクト受取):json.load()はファイルオブジェクトを直接受け取ってPythonのデータ型に変換する関数。open()で開いたファイルオブジェクトを渡す。json.loadsとの違いは「文字列ではなくファイルを受け取る」点のみ。内部では同じデシリアライズ処理が行われる。
import json
# JSONファイルを読み込む
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f) # ファイルオブジェクトを直接渡す
print(type(data)) # <class 'dict'> ← 辞書型
print(data['name']) # ファイル内のJSONデータを直接操作できる
# ちなみに:json.loadsを使った同等の処理(非推奨)
with open('data.json', 'r', encoding='utf-8') as f:
content = f.read() # まずファイル全体を文字列として読む
data = json.loads(content) # 文字列を辞書に変換
JSONデータがファイルにある→json.load()。JSONデータが文字列変数・APIレスポンス・DBから取得した値にある→json.loads()。この2択で迷うことはほぼなくなります。
03 DUMPS VS DUMP json.dumps vs json.dump——出力方向の4関数を整理 loadとloadsの逆方向がdumpとdumps。4関数を一気に理解する
| 方向 | ファイル版 | 文字列版 |
|---|---|---|
| JSON→Python(読み込み・デシリアライズ) | json.load(file) | json.loads(string) |
| Python→JSON(書き込み・シリアライズ) | json.dump(data, file) | json.dumps(data) |
3-1. json.dumpsの使い方
import json
data = {"name": "田中太郎", "age": 30, "hobbies": ["読書", "旅行"]}
# 辞書→JSON文字列
json_string = json.dumps(data)
print(json_string)
# {"name": "田中太郎", "age": 30, "hobbies": ["読書", "旅行"]}
# indent指定で見やすく整形
json_pretty = json.dumps(data, indent=2, ensure_ascii=False)
print(json_pretty)
# {
# "name": "田中太郎",
# "age": 30,
# "hobbies": [
# "読書",
# "旅行"
# ]
# }
json.dumps()のデフォルトはensure_ascii=Trueで、日本語などの非ASCII文字が「\u5c71\u7530」のようにエスケープされます。日本語を読みやすい状態で出力したい場合は必ずensure_ascii=Falseを指定してください。
3-2. json.dumpの使い方
import json
data = {"name": "田中太郎", "age": 30, "updated": True}
# 辞書→JSONファイルに書き込み
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
# output.jsonの内容:
# {
# "name": "田中太郎",
# "age": 30,
# "updated": true
# }
04 TYPE CONVERSION 型変換の仕組み——JSONとPython型の対応表 「JSONのtrue」が「PythonのTrue」になる——型変換ルールを完全理解
📚 用語解説
シリアライズ・デシリアライズ:シリアライズ(Serialize):PythonのデータをJSON文字列に変換すること(json.dump/json.dumps)。デシリアライズ(Deserialize):JSON文字列をPythonのデータに変換すること(json.load/json.loads)。「直列化・逆直列化」とも呼ばれる。
| JSON型 | Pythonの型 | 例 |
|---|---|---|
| string | str | JSON: "hello" → Python: "hello" |
| number(整数) | int | JSON: 42 → Python: 42 |
| number(小数) | float | JSON: 3.14 → Python: 3.14 |
| array | list | JSON: [1,2,3] → Python: [1, 2, 3] |
| object | dict | JSON: {"key": "val"} → Python: {"key": "val"} |
| true/false | True/False | JSON: true → Python: True(大文字T) |
| null | None | JSON: null → Python: None |
重要な点はJSONのブール値(true/false)がPythonでは大文字始まり(True/False)に変換されることです。またJSONのnullはPythonのNoneになります。
4-1. 逆方向(Python→JSON)の型対応
| Pythonの型 | JSON型 |
|---|---|
| str | string |
| int・float | number |
| list・tuple | array |
| dict | object |
| True・False | true・false(小文字に変換) |
| None | null |
datetime・set・bytes・カスタムクラスなどはデフォルトではjson.dumps()でシリアライズできずTypeErrorが発生します。datetimeを変換したい場合はisoformat()で文字列に変換してから保存する方法が一般的です。
05 PRACTICAL FLOW 実践:JSONファイルの読み込み・加工・書き込みの完全フロー 読む→加工→書く——実際の業務で使うパターン
json.load()で読む
として操作・加工
取り出し・変換
結果をファイルに保存
import json
from datetime import datetime
# Step 1: JSONファイルを読み込む
with open('users.json', 'r', encoding='utf-8') as f:
users = json.load(f)
# Step 2: データを加工する
# 全ユーザーにupdated_atフィールドを追加
for user in users:
user['updated_at'] = datetime.now().isoformat()
# アクティブユーザーだけフィルタ
active_users = [u for u in users if u.get('active', False)]
# Step 3: 別のファイルに書き出す
with open('active_users.json', 'w', encoding='utf-8') as f:
json.dump(active_users, f, indent=2, ensure_ascii=False)
print(f'{len(active_users)}件のアクティブユーザーを書き出しました')
5-1. APIレスポンスをJSONとして処理するパターン
import json
import urllib.request
def get_user_data(user_id):
url = f'https://jsonplaceholder.typicode.com/users/{user_id}'
with urllib.request.urlopen(url) as response:
# APIレスポンス(バイト列)→文字列→辞書
raw = response.read().decode('utf-8')
user = json.loads(raw)
# 必要なフィールドだけ抽出
return {
'id': user['id'],
'name': user['name'],
'email': user['email'],
'city': user['address']['city'], # ネストされた値にアクセス
}
# 使い方
user = get_user_data(1)
print(f"名前: {user['name']}, 都市: {user['city']}")
06 COMMON ERRORS よくあるエラーと解決策——TypeError・KeyError・JSONDecodeError JSON処理で頻出する3種類のエラーを網羅
6-1. TypeError: the JSON object must be str, not dict
json.loads()に辞書型(dict)を渡してしまったときに起きるエラーです。
import json
data = {"name": "田中"}
# NG: json.loadsに辞書を渡している
json.loads(data) # ← TypeError!
# OK: json.loadsには文字列を渡す
json_string = json.dumps(data) # まず辞書→文字列
result = json.loads(json_string) # 文字列→辞書(意味はないが型変換の例として)
# よくある実際のNG例:
# APIレスポンスがすでに辞書なのにjson.loadsを通そうとする
response = {"id": 1, "name": "test"} # すでに辞書
json.loads(response) # ← TypeError!
# 解決:すでに辞書なので変換不要。そのまま使う
6-2. KeyError: 'key_name'
辞書の中に指定したキーが存在しないときに起きます。JSONのフィールドが省略されている場合や、スペルミスのときに頻発します。
import json
data = json.loads('{"name": "田中", "age": 30}')
# NG: 存在しないキーにアクセス
print(data["email"]) # ← KeyError: 'email'
# OK1: .get()でデフォルト値を指定(KeyErrorが起きない)
print(data.get("email", "未設定")) # 未設定
# OK2: inで存在確認
if "email" in data:
print(data["email"])
else:
print("emailフィールドなし")
6-3. json.JSONDecodeError: Expecting value
JSON形式が正しくない文字列をjson.loads()に渡したときに発生します。
import json
# NG: Pythonの書き方(シングルクォート)はJSONではエラー
json.loads("{'name': 'tanaka'}") # ← JSONDecodeError(ダブルクォート必須)
# NG: 末尾のカンマ(Pythonは許容するがJSONはエラー)
json.loads('{"name": "tanaka",}') # ← JSONDecodeError
# OK: 正しいJSON形式
json.loads('{"name": "tanaka"}') # OK
# エラーを安全にハンドリングする方法
try:
data = json.loads("invalid json text")
except json.JSONDecodeError as e:
print(f"JSON形式エラー: {e}")
data = None
APIから返ってきたJSONデータが正しい形式か確認したいときは、jsonlint.comなどのオンラインバリデーターにコピー&ペーストすると素早くエラー箇所を特定できます。
07 CLAUDE CODE 【比較】Python手書き vs Claude Code——JSON処理の自動化 APIとDBをつなぐJSONパイプラインをClaude Codeで自動化する
ここまでPythonのjson処理を詳しく解説しました。後半では「このJSON処理をClaude Codeに書かせる・自動化する」という実践的なアプローチを解説します。
| 比較軸 | Python手書き | Claude Codeで生成 |
|---|---|---|
| コード作成時間 | 遅い(文法・API仕様を調べながら書く) | 速い(「やりたいこと」を日本語で伝えるだけ) |
| エラーハンドリング | 自分で全パターンを考える | Claude Codeが典型的なエラーを自動で組み込む |
| コード品質 | 経験・スキルに依存 | 現代的なベストプラクティスを踏まえたコードが出る |
| 日本語でのやり取り | 不可 | OK(「jsonファイルを読んでメール一覧だけ取り出して」が通じる) |
7-1. Claude CodeへのJSON処理依頼の実践例
日本語で説明
Pythonコードを生成
実行・確認
Claude Codeに相談
処理が完成
弊社GENAIでは、外部APIからJSONでデータを受け取り→加工→社内データベースに書き込むという処理を、Claude Codeで実装しています。「月次のAPIデータ取得→整形→レポート出力」というパイプラインをClaude Codeで自動化することで、以前は半日かかっていた作業が5分で完了するようになりました。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. json.loadsとjson.loadの違いは何ですか?
A. json.loadsは「文字列(str)」を受け取ってPythonの辞書等に変換します。sはstringの略です。json.loadは「ファイルオブジェクト」を受け取って変換します。APIレスポンスや変数のJSONテキストを扱うときはjson.loads、JSONファイルを読むときはjson.loadを使います。入力形式が違うだけで、内部でやっている処理(JSON→Python型変換)は同じです。
Q. Pythonでjsonを使うとき、importは必要ですか?
A. はい、ファイルの先頭に「import json」が必要です。jsonはPython標準ライブラリなので、pip installは不要です。「import json」一行でjson.load・json.loads・json.dump・json.dumpsが全て使えます。
Q. json.loadsで日本語が文字化けしてしまいます
A. 文字化けが起きる場合、まずファイルの読み込み時のエンコーディングを確認してください。open()では「encoding="utf-8"」を指定します。json.loads自体は文字列を受け取るため文字化けは起きませんが、ファイルを読む前のopen()かバイト列のdecode()でエンコーディング指定を間違えると文字化けします。json.dumps出力時の文字化けはensure_ascii=Falseで解決します。
Q. JSONDecodeErrorが起きます。原因と解決策は?
A. JSONDecodeErrorは「JSON形式として正しくない文字列を渡したとき」に発生します。よくある原因は:(1)シングルクォートを使っている(JSONはダブルクォートのみ)、(2)末尾のカンマ(Pythonは許容するがJSONは不可)、(3)空文字列を渡している、(4)APIがエラーレスポンスとして非JSON形式のテキストを返している。try-except json.JSONDecodeErrorでエラーを補足して原因を特定してください。
Q. Pythonの辞書とJSONの違いは何ですか?
A. 辞書はPythonのメモリ内のデータ構造、JSONはテキスト形式のデータ表現です。主な違いは:(1)辞書のキーはどんな型でも可、JSONのキーは文字列のみ、(2)辞書ではTrueとTrue(Pythonの大文字)、JSONではtrueとfalse(小文字)、(3)辞書のNoneはJSONではnull、(4)辞書はバイト・datetimeなどJSON非対応型を含める。辞書←→JSON変換には必ずjson.dumps(辞書→JSON)とjson.loads(JSON→辞書)を使います。
Q. Claude CodeでPythonのJSON処理コードを書いてもらえますか?
A. はい、Claude CodeはPythonのjson処理が非常に得意です。「APIからJSONを取得して整形してCSVに保存したい」「JSONファイルを読んで特定の条件でフィルタしたい」など、やりたいことを日本語で伝えるだけでコードを生成してくれます。エラーが出た場合もエラーメッセージをそのまま貼り付けると修正コードを出してくれます。json.loadsとjson.loadの使い分けも自動的に正しく判断します。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




