PythonでネストされたJSONデータを再帰的にパースする完全ガイド

この記事では、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データを効率よくパースするには、再帰処理が非常に有用です。基本的な

パース方法から始め、再帰を用いてより高度な処理を行う方法までを解説しました。この知識を用いて、より複雑なデータ構造に対応するアプリケーションやスクリプトを開発してみてください。

コメント

コメントする

目次