[Pythonのはじめ方] Part15: JSONファイルの読み書き

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)booltrue または false。Pythonでは True, False に対応。
nullNone空の値。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 に、falseFalse に、nullNone に自動的に変換されます。

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データを活用できるようになりました!

次のステップでは、プログラムのエラーに対処するための「例外処理」について学びます。お楽しみに!

参考情報

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です