はじめに
タイトルの通りです。
ネスト構造が深すぎるデータ仕様をドキュメントにまとめないといけないということで、ツールとして作成したpythonのプログラムの改修版です。
動作確認環境
- Windows10
- python3.9.4
c:\>python --version
Python 3.9.4
※まぁ、python3系であれば動くかと、、
コード
json_2_tree_structre.py
from sys import argv
import json
# 構造が変わったときのインデントスペース数定義
HIERARCHICAL_INDENT = 2
# 型名変換定数定義
REPLACE_KEYS = {"dict": "object", "list": "array"}
# キー名変換(変換)
def replace_key(key_name):
if key_name in REPLACE_KEYS:
# 定義にある場合はそのままのキー名を返す
return REPLACE_KEYS[key_name]
else:
# 定義にない場合はそのままのキー名を返す
return key_name
# データを構造構成で出力
def json_2_tree_structre(data, indent=0):
# インデント設定
space = " " * (indent)
# KeyValueの場合
if type(data) == dict:
for key in data.keys():
# キー名出力
print(space, key, sep="", end="")
# 型名出力
print(
"\t", "(%s)" % replace_key(type(data[key]).__name__), sep="", end="\n"
)
# 再帰処理
json_2_tree_structre(data[key], indent + HIERARCHICAL_INDENT)
# 配列の場合
elif type(data) == list and len(data) > 0:
# 再帰処理
json_2_tree_structre(data[0], indent)
return
def main():
# 引数チェック
if len(argv) > 1:
# ファイル読み込み
fd = open(argv[1], mode="r")
data = json.load(fd)
fd.close()
# 変換関数実行
json_2_tree_structre(data)
else:
print("args shortage")
if __name__ == "__main__":
main()
実行方法
以下のようなJSONファイルがpythonファイルと同じフォルダ内にあるとして、
sample1.json
{
"id": 1,
"type": "sample",
"data": {
"pointsA": [99, 83, 71, 59, 91],
"pointsB": [78, 69, 98, 87, 74],
"evaluation": "B",
"test": {
"temp1": "test1",
"temp2": "test2",
"temp3": "test3",
"temp4": "test4"
}
}
}
コマンドプロンプトやpowershell等で
python json_2_tree_structre.py sample1.json
を実行
こんな感じ
id (int)
type (str)
data (object)
pointsA (array)
pointsB (array)
evaluation (str)
test (object)
temp1 (str)
temp2 (str)
temp3 (str)
temp4 (str)
最後に
型とかタブとかそのあたりの出力はお好みで、、
参考
こちらの方のプログラムをベースで作らせてもらっています。