こんにちは、かつコーチです。
API連携や設定ファイルの管理をしていると、必ずと言っていいほど登場するのがJSONです。
JSONとは「JavaScript Object Notation」の略で、データを構造化して表現するための軽量なフォーマットです。
Pythonには、このJSONを扱うためのjsonモジュールが標準ライブラリとして用意されています。
インストール不要で、import jsonとするだけですぐに使い始められます。
この記事では、jsonモジュールを使ったデータの読み書きの基本を解説します。
特に初心者がつまずきやすい日本語の文字化け問題についても、実体験を交えて紹介します。
jsonモジュールの基本操作
Pythonの辞書をJSON文字列に変換する
Pythonの辞書(キーと値のペアを管理するデータ型)をJSON形式の文字列に変換するには、json.dumps()を使います。
import json
user = {
"name": "Katsu",
"age": 30,
"is_active": True,
}
json_str = json.dumps(user)
print(json_str)
# {"name": "Katsu", "age": 30, "is_active": true}
PythonのTrueやFalseが、JSONではtrueやfalseに変換されている点に注目してください。
このように、jsonモジュールはPythonの型とJSONの型を自動で対応させてくれます。
JSON文字列をPythonの辞書に変換する
反対に、JSON文字列をPythonのオブジェクトに変換するにはjson.loads()を使います。
import json
json_str = '{"name": "Katsu", "age": 30}'
user = json.loads(json_str)
print(user["name"]) # Katsu
print(type(user)) # <class 'dict'>
json.loads()は文字列を受け取り、Pythonの辞書として扱えるオブジェクトを返します。dumpsとloadsの「s」は「string」の頭文字で、文字列を対象とすることを表しています。
JSONファイルへの書き込み
ファイルとして保存したい場合はjson.dump()を使います。dumpsと違ってsがないので混同しやすいですが、こちらはファイルオブジェクトに直接書き込む関数です。
import json
user = {"name": "Katsu", "age": 30}
with open("user.json", "w", encoding="utf-8") as f:
json.dump(user, f, ensure_ascii=False, indent=2)
indent=2を指定すると、見やすい形に整形されたJSONファイルが出力されます。ensure_asciiについては、次の見出しで詳しく説明します。
JSONファイルの読み込み
保存したJSONファイルを読み込むにはjson.load()を使います。
import json
with open("user.json", "r", encoding="utf-8") as f:
user = json.load(f)
print(user)
# {'name': 'Katsu', 'age': 30}
ファイルを開くときは、encoding="utf-8"を指定する習慣をつけておくと安全です。
特にWindows環境では、指定しないとデフォルトのエンコーディングが異なる場合があります。
よくあるつまずきポイント・エラー対処
日本語がエスケープされて文字化けする
Before(つまずいたコード)
import json
user = {"name": "勝田", "city": "東京"}
json_str = json.dumps(user)
print(json_str)
実行すると、次のような結果になります。
{"name": "勝田", "city": "東京"}
私は初めてこの出力を見たとき「日本語が壊れた」と焦りました。
実はこれは壊れているのではなく、正しく変換された結果です。
json.dumps()のデフォルト設定では、ensure_ascii=Trueになっています。
この設定により、ASCII文字以外(日本語を含む)は自動的に\uXXXX形式にエスケープされます。
After(改善したコード)
import json
user = {"name": "勝田", "city": "東京"}
json_str = json.dumps(user, ensure_ascii=False)
print(json_str)
# {"name": "勝田", "city": "東京"}
ensure_ascii=Falseを指定することで、日本語をそのまま出力できます。
ファイルに書き込むjson.dump()でも同様に、この引数を必ず確認しましょう。
キーが存在しないとエラーになる
Before(つまずいたコード)
import json
json_str = '{"name": "Katsu"}'
user = json.loads(json_str)
print(user["age"])
存在しないキーにアクセスすると、次のエラーが発生します。
KeyError: 'age'
After(改善したコード)
import json
json_str = '{"name": "Katsu"}'
user = json.loads(json_str)
age = user.get("age", "未設定")
print(age)
# 未設定
辞書のget()メソッドを使えば、キーが存在しない場合にデフォルト値を返せます。
外部APIから受け取るJSONは、項目が欠けている可能性を常に考慮しておく必要があります。
まとめ
この記事のポイント
- jsonモジュールはPythonでJSONデータを扱う標準ライブラリです
- 文字列変換には
json.dumps()とjson.loads()を使います - ファイル入出力には
json.dump()とjson.load()を使います - 日本語を扱う場合は
ensure_ascii=Falseを必ず指定しましょう - 存在しないキーへのアクセスは
get()メソッドで安全に処理できます
次に読むべき記事
CSVファイルとJSONファイルを使い分けたい方は、csvモジュールの解説記事もあわせてご覧ください。
ファイルパスの扱いに不安がある方は、osモジュールの基本記事も参考になります。
タグ: Python, 初心者向け, 標準ライブラリ