jsonモジュールを使った読み書き | JSONファイルの操作 | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

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内の truenull といった値は、Pythonの TrueNone へと、言語仕様に合わせて自動的にマッピングされます。

実践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のリストへ、{} は 辞書へ、nullNone へと双方向に自動変換されます。

これら4つのメソッドを適切に組み合わせることで、複雑な外部システムとのデータ連携や、アプリケーションの設定管理をスマートに実装できるようになります。