■概要
データ項目の順番がバラバラな複数の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を以下に示す。
コメント
good!!!