【Python】jsonモジュールでJSONデータを読み書きする

Python

こんにちは、かつコーチです。

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のTrueFalseが、JSONではtruefalseに変換されている点に注目してください。
このように、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の辞書として扱えるオブジェクトを返します。
dumpsloadsの「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, 初心者向け, 標準ライブラリ

タイトルとURLをコピーしました