【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ファイル読み込み処理…
終了
終了
Text is not SVG – cannot display

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

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

開始
開始
JSONデータ格納リスト初期化
JSONデータ格納リスト初期化
ファイル名順に読み込み
ファイル名順に読み込み
JSONファイル数分繰り返し
JSONファイル数分繰り返し
JSONファイル
JSONファイル
JSONデータ格納DICTの初期化
JSONデータ格納DICTの初期化
JSONファイル
JSONファイル
JSONデータをDICTに変換
JSONデータをDICTに変換
DICTの中身をソート
DICTの中身をソート
JSONデータ格納リストにDICTを格納
JSONデータ格納リストにDICTを格納
JSONデータ整形と出力処理
JSONデータ整形と出力処理
終了
終了
JSONファイルオープン
JSONファイルオープン
JSONデータ読み込み
JSONデータ読み込み
Text is not SVG – cannot display

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

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

コンソール
コンソール
開始
開始
リストの要素数分繰り返し
リストの要素数分繰り返し
要素数出力
要素数出力
要素数
要素数
DICTの要素数分繰り返し
DICTの要素数分繰り返し
Key
Key
data
data
else
else
KEYを出力
KEYを出力
KEY
KEY
区切り出力
区切り出力
「data」の要素数分繰り返し
「data」の要素数分繰り返し
「data」のKEYとVALUEを出力
「data」のKEYとVALUEを出力
区切り出力
区切り出力
区切り
区切り
KEY・VALUE
[data]
KEY・VALUE…
区切り
区切り
KEYとVALUEを出力
KEYとVALUEを出力
KEY・VALUE
KEY・VALUE
改行を出力
改行を出力
終了
終了
改行
改行
Text is not SVG – cannot display

■サンプルコード

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

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をコピーしました