jsonモジュールを使った読み書き

Pythonを使ってWeb APIと通信したり、設定ファイルを管理したりする際に、避けて通れないのが「JSON(JavaScript Object Notation)」というデータ形式です。JSONは人間にとってもコンピュータにとっても読み書きしやすい、軽量なテキストベースのデータフォーマットです。
Pythonには、このJSONを標準でサポートする json モジュールが用意されています。これを使うことで、Pythonの「辞書(dict)」や「リスト(list)」といったデータ構造と、JSON形式のデータとの間を簡単なコマンドで行き来させることができます。
JSONファイルからデータを読み込む(json.load)
保存されているJSONファイルを読み込んで、Pythonの辞書やリストとして扱いたい場合は json.load()(末尾に s が付かない)を使用します。
import json
# ファイルを読み込みモード('r')で開く
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
print(data)
print(type(data)) # <class 'dict'>(自動的に辞書型に変換される)
このコードでは、json.load() がファイルの中身を自動的に解析(パース)し、Pythonが直接操作できる辞書オブジェクトに変換してくれます。
JSONファイルへデータを書き込む(json.dump)
Pythonの辞書やリストのデータを、JSONファイルとして新規保存(または上書き)したい場合は json.dump() を使用します。
import json
data_to_write = {
"name": "山田",
"age": 30,
"city": "東京",
"skills": ["Python", "SQL"]
}
# ファイルを書き込みモード('w')で開く
with open('output.json', 'w', encoding='utf-8') as file:
# indent=4 で読みやすく整形、ensure_ascii=False で日本語の文字化けを防ぐ
json.dump(data_to_write, file, indent=4, ensure_ascii=False)
実務で極めて重要になるのが、オプション引数である ensure_ascii=False です。これを指定しないと、日本語などの全角文字が \u5c71\u7530 のようなUnicodeエスケープ文字に変換されてしまい、ファイルを生テキストとして読めなくなってしまいます。
「ファイル」と「文字列」を見分ける4つのメソッド
json モジュールで初心者が最もつまずきやすいのが、メソッド名の「末尾の s の有無」です。この s は「String(文字列)」の頭文字を意味しています。
対象が「ファイルそのもの」なのか、それともプログラム内の一画にある「テキスト(文字列)変数」なのかによって、以下のように明確に使い分けます。
| メソッド名 | 末尾のs | 具体的な役割・用途 |
|---|---|---|
json.load(file) |
なし | ファイルオブジェクトからJSONデータを直接読み込み、Pythonのデータに変換する。 |
json.loads(string) |
あり | JSON形式の形をした「文字列(String)」を読み込み、Pythonのデータに変換する。 |
json.dump(obj, file) |
なし | Pythonのデータを、直接ファイルオブジェクトへ書き込んで保存する。 |
json.dumps(obj) |
あり | Pythonのデータを、JSON形式の「文字列(String)」に変換して変数に格納する。 |
実践1:JSON「文字列」をパースする(json.loads)
Web APIからネットワーク経由でデータを受け取った際など、ファイルではなく「テキストデータ」としてJSONが手元にある場合は json.loads() を使用します。
import json
# JSON構造をしたただの「文字列」
json_string = '{"name": "John", "age": 30, "is_admin": true}'
# 文字列から辞書型へ変換
data = json.loads(json_string)
print(data["name"]) # 出力: John
print(data["is_admin"]) # 出力: True(Pythonのbool型に自動変換される)
JSON内の true や null といった値は、Pythonの True や None へと、言語仕様に合わせて自動的にマッピングされます。
実践2:データをJSON「文字列」に変換する(json.dumps)
ファイルに保存するわけではないけれど、ログ出力のために文字列化したい、あるいはサーバーへ送信するためにテキストデータに変換したい、という場合は json.dumps() を使用します。
import json
user_dict = {"id": 101, "status": "active"}
# 辞書型からJSON文字列へ変換
converted_string = json.dumps(user_dict)
print(converted_string) # 出力: '{"id": 101, "status": "active"}'
print(type(converted_string)) # <class 'str'>
まとめ
Pythonにおける json モジュールの重要ポイントは以下の通りです。
sの有無で対象を見極める:load/dumpは直接ファイル(File)を扱い、loads/dumpsはメモリ上の文字列(String)を扱います。- 実務では文字コードに配慮する:日本語を含むJSONを扱う際は、
open()側のencoding='utf-8'と、dump()側のensure_ascii=Falseのセット指定が文字化けを防ぐ鉄則です。 - データの自動型変換:JSONの
[]は Pythonのリストへ、{}は 辞書へ、nullはNoneへと双方向に自動変換されます。
これら4つのメソッドを適切に組み合わせることで、複雑な外部システムとのデータ連携や、アプリケーションの設定管理をスマートに実装できるようになります。