この記事では、Pythonを使用してネストされたJSONデータを再帰的にパースする方法について解説します。具体的なコード例、その詳細解説、および応用例を含めています。JSONデータはWeb APIや設定ファイルなど、多くの場で用いられますが、しばしばネストされた形で提供されることがあります。このような複雑なデータ構造を効率よく処理するための手法を身につけましょう。
目次
再帰とは
再帰とは、関数が自分自身を呼び出すことを指します。これにより、ループを使わずに繰り返しの処理が可能となります。特に、木構造やネストされたデータ構造を扱う場合に有用です。
基本的なJSONデータのパース方法
Pythonには`json`という標準ライブラリが存在し、このライブラリを用いることでJSONデータの読み込みや書き込みが可能です。
import json
# JSONデータをPythonオブジェクトに変換
json_data = '{"name": "John", "age": 30, "city": "New York"}'
parsed_data = json.loads(json_data)
print(parsed_data["name"]) # 出力: John
上記のコードでは、JSON形式の文字列`json_data`をPythonのディクショナリに変換しています。
再帰を用いたネストされたJSONデータのパース
再帰関数の設計
再帰関数を用いることで、任意の深さにネストされたJSONデータも一括でパースすることが可能です。
def recursive_parse(json_obj):
if isinstance(json_obj, dict):
for key, value in json_obj.items():
print(f"Key: {key}")
recursive_parse(value)
elif isinstance(json_obj, list):
for index, item in enumerate(json_obj):
print(f"Index: {index}")
recursive_parse(item)
else:
print(f"Value: {json_obj}")
実行例
import json
nested_json_data = '{"person": {"name": "John", "details": {"age": 30, "addresses": [{"city": "New York"}, {"city": "Boston"}]}}}'
parsed_data = json.loads(nested_json_data)
recursive_parse(parsed_data)
応用例
応用例1: フィルタリング機能の追加
def recursive_parse_with_filter(json_obj, filter_key):
if isinstance(json_obj, dict):
for key, value in json_obj.items():
if key == filter_key:
print(f"Matched Key: {key}, Value: {value}")
else:
recursive_parse_with_filter(value, filter_key)
elif isinstance(json_obj, list):
for item in json_obj:
recursive_parse_with_filter(item, filter_key)
応用例2: データの変更
def recursive_modify(json_obj, target_key, new_value):
if isinstance(json_obj, dict):
for key, value in json_obj.items():
if key == target_key:
json_obj[key] = new_value
else:
recursive_modify(value, target_key, new_value)
elif isinstance(json_obj, list):
for item in json_obj:
recursive_modify(item, target_key, new_value)
応用例3: データの集計
def recursive_count(json_obj, target_key):
count = 0
if isinstance(json_obj, dict):
for key, value in json_obj.items():
if key == target_key:
count += 1
count += recursive_count(value, target_key)
elif isinstance(json_obj, list):
for item in json_obj:
count += recursive_count(item, target_key)
return count
まとめ
PythonでネストされたJSONデータを効率よくパースするには、再帰処理が非常に有用です。基本的な
パース方法から始め、再帰を用いてより高度な処理を行う方法までを解説しました。この知識を用いて、より複雑なデータ構造に対応するアプリケーションやスクリプトを開発してみてください。
コメント