【Python】複数のJSONファイルを取り込み、整形して出力する

■概要

データ項目の順番がバラバラな複数のJSONファイルに対して、ソート・整形をして、コンソールに出力する処理を実装する。

各要件については以下の通りとする。

▼JSONファイルのデータ項目

JSONデータのレイアウトについては、以下の通り。

{
    "title": "<タイトル>",
    "data": {
        "id":<id>,
        "name": "<名前>",
        "value": "<値>" 
    },
    "date": "<日付(YYYYMMDD)>"
}

▼実装するモジュールのディレクトリ階層

今回実装するモジュールについて、ディレクトリ階層を以下に示す。

.
├── format_output_json.py
└── json_data_dir
    ├── sample1.json
    ├── sample2.json
    └── sample3.json

▼対象のJSONファイル

以下、今回取り込む3つのJSONファイルを示す。
なお、各JSONファイルのデータ項目はバラバラの順(ソートされていない)で表記するものとする。

・sample1.json

{
    "title": "sample1",
    "data": {
        "id":1,
        "name": "test1",
        "value": "hoge" 
    },
    "date": "20231201"
}

・sample2.json

{
    "date": "20231204",
    "title": "sample2",
    "data": {
        "id":2,
        "name": "test2",
        "value": "hoge" 
    }
}

・sample3.json

{
    "title": "sample3",
    "date": "20231206",
    "data": {
        "id":3,
        "name": "test3",
        "value": "hoge" 
    }    
}

▼出力イメージ

ソート・整形をして、コンソールに出力するイメージを以下に示す。

========== json file 1 ==========
data
 ------------------------------
 id             1
 name           test1
 value          hoge
 ------------------------------
date           20231201
title          sample1

========== json file 2 ==========
:
:
:
  • 各JSONファイルの先頭は「=」で区切り、ファイル番号(1から昇順)を付与する。
  • 「data」部はさらに「-」で区切り表示する。
    また、先頭に半角スペースを付与して、インデントを下げる。

■フローチャート

各処理のフローチャートを以下に示す。

▼メイン処理

メイン処理のフローチャートを以下に示す。

▼JSONファイル読み込み処理

JSONファイル読み込み処理のフローチャートを以下に示す。

▼JSONデータ整形と出力処理

JSONデータ整形と出力処理のフローチャートを以下に示す。

■サンプルコード

サンプルコードを以下に示す。

import collections
import glob
import json


# JSONファイル格納パス
JSON_FILE_PATH = './json_data_dir/*.json'


# JSONデータ整形と出力処理
def format_output_json_data(list_data):
    # リストの要素数分繰り返し
    for i, dict_data in enumerate(list_data):
        # 要素数出力
        print(f'{"="*10} json file {i+1} {"="*10}')
        # DICTの要素数分繰り返し
        for dict_key, dict_val in dict_data.items():
            # KEYが「data」の場合
            if dict_key == 'data':
                # KEYを出力
                print(dict_key)
                # 区切り出力
                print(f' {"-"*30}')
                # 「data」の要素数分繰り返し
                for data_key, data_val in dict_val.items():
                    # 「data」のKEYとVALUEを出力
                    print(f' {data_key:15}{data_val}')
                # 区切り出力
                print(f' {"-"*30}')
            else:
                # KEYとVALUEを出力
                print(f'{dict_key:15}{dict_val}')
        # 改行を出力
        print()


# JSONファイル読み込み処理
def input_json_files():
    # JSONデータ格納リスト初期化
    json_data_list = []
    # ファイル名順に読み込み
    json_files = sorted(glob.glob(JSON_FILE_PATH))
    # JSONファイル数分繰り返し
    for json_file in json_files:
        # JSONデータ格納DICTの初期化
        json_dict = {}
        # JSONファイルオープン
        with open(json_file) as jfile:
            # JSONデータ読み込み
            json_data = jfile.read()

        # JSONデータをDICTに変換
        json_dict = json.loads(json_data)
        # DICTの中身をソート
        json_dict = collections.OrderedDict(
            sorted(json_dict.items(), key=lambda d: d[0])
        )
        # JSONデータ格納リストにDICTを格納
        json_data_list.append(json_dict)

    # JSONデータ整形と出力処理
    format_output_json_data(json_data_list)


# メイン処理
if __name__ == '__main__':
    # JSONファイル読み込み処理呼び出し
    input_json_files()

■実行結果

複数のJSONファイルを取り込み、整形して出力する処理の実行結果を以下に示す。

========== json file 1 ==========
data
 ------------------------------
 id             1
 name           test1
 value          hoge
 ------------------------------
date           20231201
title          sample1

========== json file 2 ==========
data
 ------------------------------
 id             2
 name           test2
 value          hoge
 ------------------------------
date           20231204
title          sample2

========== json file 3 ==========
data
 ------------------------------
 id             3
 name           test3
 value          hoge
 ------------------------------
date           20231206
title          sample3

■参考

今回の処理を実装するにあたり、参考とさせていただいたURLを以下に示す。

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