PythonでJSONデータを扱ってみよう!
プログラミングをしていると、設定ファイルやAPIとのデータ交換などでJSON (JavaScript Object Notation) という形式のデータによく出会います。JSONは人間にも読み書きしやすく、プログラムでも扱いやすいデータ形式として広く使われています。
このステップでは、Pythonの標準ライブラリである json
モジュールを使って、PythonのデータとJSON形式のデータを相互に変換したり、JSONファイルを読み書きしたりする方法を学びます。💪
1. JSONってどんな形式? 🤔
JSONは、キーと値のペア(オブジェクト、Pythonの辞書に似ています)と、値の順序付きリスト(配列、Pythonのリストに似ています)を組み合わせてデータを表現します。
基本的なデータ型は以下の通りです。
JSONのデータ型 | Pythonのデータ型 | 説明 |
---|---|---|
オブジェクト (Object) | dict |
キーと値のペアの集まり。例: {"name": "Taro", "age": 30} |
配列 (Array) | list |
順序付けられた値のリスト。例: ["apple", "banana", "cherry"] |
文字列 (String) | str |
ダブルクォーテーションで囲まれたテキスト。例: "Hello, World!" |
数値 (Number) | int , float |
整数または浮動小数点数。例: 123 , 3.14 |
真偽値 (Boolean) | bool |
true または false 。Pythonでは True , False に対応。 |
null | None |
空の値。Pythonの None に対応。 |
このように、Pythonの基本的なデータ型とJSONのデータ型は非常によく似ているため、相互に変換しやすいのが特徴です。
2. PythonでJSONを扱う準備 🔧
PythonでJSONデータを扱うには、標準ライブラリの json
モジュールをインポートします。特別なインストールは必要ありません。
import json
これで準備完了です!🎉
3. PythonオブジェクトをJSON文字列に変換する (エンコード) ➡️
Pythonの辞書やリストなどのオブジェクトをJSON形式の文字列に変換するには、json.dumps()
関数を使います。(”dumps” は “dump string” の意味です。)
import json
# Pythonの辞書データ
data = {
"name": "Yamada",
"age": 25,
"city": "Tokyo",
"skills": ["Python", "Web開発", "データ分析"]
}
# PythonオブジェクトをJSON文字列に変換
json_string = json.dumps(data)
print(json_string)
# 出力例: {"name": "Yamada", "age": 25, "city": "Tokyo", "skills": ["Python", "Web\u958b\u767a", "\u30c7\u30fc\u30bf\u5206\u6790"]}
⚠️ 日本語が \uXXXX になっちゃう?
デフォルトでは、json.dumps()
はASCII文字以外(日本語など)を \uXXXX
という形式にエスケープします。日本語をそのまま表示したい場合は、引数 ensure_ascii=False
を指定します。
# 日本語をそのまま出力
json_string_jp = json.dumps(data, ensure_ascii=False)
print(json_string_jp)
# 出力例: {"name": "Yamada", "age": 25, "city": "Tokyo", "skills": ["Python", "Web開発", "データ分析"]}
✨ JSONを見やすく整形する
生成されたJSON文字列は通常1行で出力されますが、indent
引数を指定すると、見やすくインデント(字下げ)された形式で出力できます。数値はインデントするスペースの数を指定します。
# インデントをつけて整形
json_string_pretty = json.dumps(data, ensure_ascii=False, indent=4)
print(json_string_pretty)
# 出力例:
# {
# "name": "Yamada",
# "age": 25,
# "city": "Tokyo",
# "skills": [
# "Python",
# "Web開発",
# "データ分析"
# ]
# }
4. PythonオブジェクトをJSONファイルに書き込む 📝
PythonオブジェクトをJSON形式でファイルに保存するには、json.dump()
関数を使います。(”dump” はファイルなどに出力するという意味です。)ファイル操作 (open()
や with
) と組み合わせて使います。
import json
data = {
"user_id": 101,
"username": "sato",
"email": "sato@example.com",
"active": True,
"settings": {
"theme": "dark",
"notifications": ["email", "push"]
}
}
# ファイルに書き込む (ensure_ascii=False と indent=4 で日本語対応&整形)
# 'w' は書き込みモード、encoding='utf-8' で文字化けを防ぐ
file_path = 'user_data.json'
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
print(f"データが {file_path} に保存されました。🎉")
このコードを実行すると、カレントディレクトリに user_data.json
というファイルが作成され、整形されたJSONデータが書き込まれます。
💡 `dump()` vs `dumps()`
json.dump(obj, fp, ...)
: Pythonオブジェクトobj
をファイルオブジェクトfp
にJSON形式で書き込む。json.dumps(obj, ...)
: Pythonオブジェクトobj
をJSON形式の文字列に変換して返す。
ファイルに直接書き込みたい場合は dump()
、JSON文字列として扱いたい場合(例: APIレスポンスとして返すなど)は dumps()
を使います。
5. JSON文字列をPythonオブジェクトに変換する (デコード) ⬅️
JSON形式の文字列をPythonのオブジェクト(辞書やリストなど)に変換するには、json.loads()
関数を使います。(”loads” は “load string” の意味です。)
import json
# JSON形式の文字列 (例: APIから受け取ったデータなど)
json_string = '{"product_id": "P001", "name": "スマートフォン", "price": 80000, "in_stock": true}'
# JSON文字列をPythonオブジェクト(辞書)に変換
product_data = json.loads(json_string)
print(product_data)
# 出力例: {'product_id': 'P001', 'name': 'スマートフォン', 'price': 80000, 'in_stock': True}
# Pythonオブジェクトとしてアクセスできる
print(f"商品名: {product_data['name']}") # 出力: 商品名: スマートフォン
print(f"価格: {product_data['price']}") # 出力: 価格: 80000
JSON文字列中の true
はPythonの True
に、false
は False
に、null
は None
に自動的に変換されます。
6. JSONファイルからPythonオブジェクトを読み込む 📖
JSONファイルの内容を読み込んでPythonオブジェクトに変換するには、json.load()
関数を使います。これもファイル操作と組み合わせて使います。
import json
# 先ほど保存した user_data.json を読み込む
file_path = 'user_data.json'
try:
# 'r' は読み込みモード、encoding='utf-8' を指定
with open(file_path, 'r', encoding='utf-8') as f:
loaded_data = json.load(f)
print("JSONファイルから読み込んだデータ:")
print(loaded_data)
# 出力例:
# JSONファイルから読み込んだデータ:
# {'user_id': 101, 'username': 'sato', 'email': 'sato@example.com', 'active': True, 'settings': {'theme': 'dark', 'notifications': ['email', 'push']}}
# 読み込んだデータにアクセス
print(f"\nユーザー名: {loaded_data['username']}")
print(f"テーマ設定: {loaded_data['settings']['theme']}")
except FileNotFoundError:
print(f"エラー: ファイル '{file_path}' が見つかりません。")
except json.JSONDecodeError:
print(f"エラー: ファイル '{file_path}' は正しいJSON形式ではありません。")
except Exception as e:
print(f"予期せぬエラーが発生しました: {e}")
ファイルが存在しない場合や、ファイルの内容が正しいJSON形式でない場合にエラーが発生する可能性があるため、try...except
ブロックを使ってエラー処理を行うのが一般的です。(エラー処理については Step 4 で詳しく学びます。)
💡 `load()` vs `loads()`
json.load(fp, ...)
: ファイルオブジェクトfp
からJSONデータを読み込み、Pythonオブジェクトに変換して返す。json.loads(s, ...)
: JSON形式の文字列s
をPythonオブジェクトに変換して返す。
ファイルから直接読み込みたい場合は load()
、文字列として持っているJSONデータを変換したい場合は loads()
を使います。
7. まとめ 🥳
今回は、PythonでJSONデータを扱うための json
モジュールの基本的な使い方を学びました。
- JSONは、プログラム間でデータをやり取りする際によく使われる形式です。
- Pythonの
json
モジュールを使うと、PythonオブジェクトとJSON形式の相互変換が簡単にできます。 json.dumps()
: PythonオブジェクトをJSON文字列に変換 (エンコード)。json.dump()
: PythonオブジェクトをJSONファイルに書き込む。json.loads()
: JSON文字列をPythonオブジェクトに変換 (デコード)。json.load()
: JSONファイルを読み込んでPythonオブジェクトに変換。ensure_ascii=False
で日本語の文字化けを防ぎ、indent
で見やすく整形できます。- ファイル操作時には
encoding='utf-8'
を指定し、エラー処理 (try...except
) を行うことが推奨されます。
これで、設定ファイルの読み込みやWeb APIから取得したデータの処理など、様々な場面でJSONデータを活用できるようになりました! ✨
次のステップでは、プログラムのエラーに対処するための「例外処理」について学びます。お楽しみに!
参考情報 📚
-
Python 公式ドキュメント – json — JSON エンコーダおよびデコーダ:
https://docs.python.org/ja/3/library/json.html
jsonモジュールの詳細な仕様やオプションについて確認できます。
-
JSON入門 – とほほのWWW入門:
https://www.tohoho-web.com/json/
JSON形式そのものについて、わかりやすく解説されています。
コメント