今回は、Pythonでjson.loads()関数を使ってJSON形式の文字列を変換する方法についてご紹介します。
json.loads()関数とは
json.loads()は、Pythonのjsonモジュールに含まれる関数です。
JSON形式の文字列をPythonの辞書やリストなどのオブジェクトに変換します。
JSON(JavaScript Object Notation)は、データを扱う際によく利用される軽量なデータ形式です。
json.loads()を使えば、外部から受け取ったJSON文字列を簡単にPythonのデータ型に置き換えられます。
json.loads()関数の基本的な使い方
基本的な手順はとてもシンプルです。
以下の例では、辞書を表すJSON文字列をPythonの辞書型に変換しています。
1 2 3 4 5 6 7 8 9 |
import json # JSON形式の文字列 json_str = '{"name": "Taro", "age": 30, "is_student": false}' # json.loads()で文字列をPythonオブジェクトへ変換 data = json.loads(json_str) print(data) |
{‘name’: ‘Taro’, ‘age’: 30, ‘is_student’: False}
変換後、JSONのfalseはPythonのFalseに置き換わる点に注意してください。
同様に、nullはPythonのNone、trueはPythonのTrueに変換されます。
リスト形式のJSONは、以下のようにPythonのリストへ変換されます。
1 2 3 4 5 6 |
import json json_str = '["apple", "banana", "cherry"]' data = json.loads(json_str) print(data) |
[‘apple’, ‘banana’, ‘cherry’]
複雑な入れ子構造を含むJSON文字列であっても、json.loads()は適切な入れ子構造を持ったPythonオブジェクトとして返します。
下記のように、辞書やリストを何重にもネストしたJSONでも問題なく扱えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import json json_str = ''' { "user": { "name": "Hanako", "age": 25 }, "hobbies": ["reading", "swimming"] } ''' data = json.loads(json_str) print(data) |
{‘user’: {‘name’: ‘Hanako’, ‘age’: 25}, ‘hobbies’: [‘reading’, ‘swimming’]}
このようにjson.loads()を使うことで、階層構造をそのままPythonの辞書やリストとして扱うことができます。
json.loads()関数を使った応用例
json.loads()では、object_hookやparse_intなどのオプション引数を活用できます。
これらを利用すると、デフォルトの型変換に一工夫加えることが可能です。
object_hookでのカスタム変換
たとえば、全てのキーを大文字に変換したい場合はobject_hookを使います。
1 2 3 4 5 6 7 8 9 |
import json def upper_keys(d): return {k.upper(): v for k, v in d.items()} json_str = '{"name": "Taro", "age": 30}' data = json.loads(json_str, object_hook=upper_keys) print(data) |
{‘NAME’: ‘Taro’, ‘AGE’: 30}
object_hookは、JSONオブジェクトが辞書に変換された直後に実行される関数を指定する引数です。
データの各キーや値に対して自由にカスタマイズができます。
parse_intやparse_floatによる数値処理のカスタマイズ
parse_intやparse_floatを指定すると、JSON文字列から読み込んだ整数や浮動小数点数の型を自由に扱えます。
例えば、数値を全て文字列として扱いたい場合などに有効です。
- parse_int: 整数をどの型や関数で扱うかを指定
- parse_float: 浮動小数点数をどの型や関数で扱うかを指定
よくあるエラーと対処法
不正なJSON文字列を引数に渡すと、json.JSONDecodeErrorが発生します。
対処するには、try/except構文で例外処理を行います。
1 2 3 4 5 6 7 8 9 |
import json # JSON文字列が不正(閉じ括弧が足りない例) json_str = '{"name": "Taro", "age": 30' try: data = json.loads(json_str) except json.JSONDecodeError as e: print("JSONの解析に失敗しました:", e) |
JSONの解析に失敗しました: Expecting ‘,’ delimiter: line 1 column 29 (char 28)
エラー内容が返されるため、何が原因でデコードに失敗したかを知ることができます。
その他にも、メモリ使用量に注意が必要な場合があります。
非常に大きなJSONを一度に読み込むとメモリを圧迫するので、json.load()やストリーミング処理を検討するとよいでしょう。
また、信頼できないソースから取得したJSONでは、不正なデータや意図しない構造が混入する可能性があります。
エラーハンドリングやバリデーションを行い、想定外の動作を防止してください。
まとめ
json.loads()は、JSON形式の文字列をPythonオブジェクトへ変換するための便利な関数です。
基本的な使い方からオプション引数、エラーハンドリングまで理解しておくと、様々な場面で役立ちます。
正しい型変換を把握しつつ、必要に応じてカスタマイズや例外処理を行うのがおすすめです。