JSONView.py テクニカルドキュメント
プログラムの動作
JSONView.py は、Pythonで記述されたGUIアプリケーションであり、JSONファイルを視覚的に閲覧するために設計されています。このプログラムは、指定されたJSONファイルの内容をツリー構造で表示し、キーと値を異なる列に整理して表示します。
主な機能:
JSONデータの視覚化: 大規模または複雑なJSONファイルを、ネストされた構造を容易に理解できるツリー形式で表示します。
キーと値の分離表示: 各JSONオブジェクトのキーと対応する値を、それぞれ独立した列に表示することで、情報の識別を容易にします。
階層構造の展開/折りたたみ: ネストされたJSONオブジェクトや配列は、ユーザーがクリックして展開したり折りたたんだりできるノードとして表示されます。
ウィンドウサイズの設定と保存: プログラム起動時にウィンドウサイズを指定できるほか、前回の終了時のウィンドウサイズを自動的に保存し、次回起動時にそのサイズを復元します。これにより、ユーザーの作業環境に合わせた柔軟な表示が可能です。
解決する課題:
JSONファイルは、特にデータ量が多く、ネストが深い場合に、テキストエディタでその構造を把握したり、特定のデータを見つけ出すことが困難になることがあります。JSONView.py は、このような課題を解決し、データの構造を直感的に理解し、効率的に閲覧できるGUIを提供します。
原理
JSONView.py は、以下の主要な技術とアルゴリズムに基づいて動作します。
GUIフレームワーク: Pythonの標準ライブラリである
tkinterを使用して、グラフィカルユーザーインターフェースを構築しています。特に、ttk.Treeviewウィジェットを利用して、JSONデータの階層構造をツリー形式で表示しています。JSONパース:
json標準ライブラリのjson.load()関数を使用して、指定されたJSONファイルの内容を読み込み、Pythonの辞書 (dict) やリスト (list) オブジェクトに変換します。これにより、JSONデータがPythonプログラム内で扱いやすい形式になります。階層表示アルゴリズム:
insert_item関数は再帰的なアルゴリズムを採用しており、Pythonオブジェクトに変換されたJSONデータをツリービューに挿入します。辞書 (
dict) の場合: 辞書のキーがツリーの親ノードとして挿入されます。その後、その辞書内の各キーと値に対してinsert_item関数が再帰的に呼び出され、子ノードとして追加されます。リスト (
list) の場合: リストのキー(または親ノードのテキスト)に[]を付加したノードが親として挿入されます。リストの各要素は、Item 0,Item 1, ... のようなキーを持つ子ノードとして、insert_item関数によって再帰的に処理されます。プリミティブ型 (文字列、数値、真偽値など) の場合: キーと値がツリーの現在の親ノードの子として直接挿入されます。この場合、値はツリービューの「Value」列に表示されます。
設定の永続化:
tomlライブラリを使用して、プログラムの設定(現在のウィンドウサイズなど)をTOML形式のファイルに保存および読み込みます。これにより、プログラムの起動時に以前のセッション設定を復元し、終了時に現在の設定を保存できます。
必要な非標準ライブラリとインストール方法
JSONView.py を実行するには、以下の非標準ライブラリが必要です。
toml: TOML形式の設定ファイルを読み書きするために使用されます。
インストール方法:
pip コマンドを使用してインストールできます。
pip install toml
必要な入力ファイル
JSONView.py は、以下の入力ファイルを期待します。
JSONデータファイル:
ファイル形式: 有効なJSON (JavaScript Object Notation) 形式のテキストファイル。
データ構造: オブジェクト (
{}) または配列 ([]) をルートとする任意の有効なJSON構造。指定方法: コマンドライン引数の最初の引数としてファイルパスを指定します。
例 (data.json):
{ "metadata": { "timestamp": "2023-10-27T10:00:00Z", "source": "example_api" }, "users": [ { "id": 1, "name": "Alice", "email": "alice@example.com", "isActive": true, "roles": ["admin", "editor"] }, { "id": 2, "name": "Bob", "email": "bob@example.com", "isActive": false, "roles": ["viewer"] } ], "version": 1.0 }
設定ファイル (オプション):
JSONView.iniファイル名:
JSONView.pyと同じディレクトリにJSONView.iniという名前で存在する場合に読み込まれます。ファイル形式: TOML (Tom's Obvious, Minimal Language) 形式。
データ構造: ウィンドウの初期サイズ (
geometry) を指定できます。このファイルが存在しない場合、デフォルトのサイズ (600x400) が使用されます。例 (JSONView.ini):
geometry = "800x600"
生成される出力ファイル
JSONView.py は、プログラムが正常に終了する際に、以下の設定ファイルを自動的に生成または更新します。
設定ファイル:
JSONView.iniファイル名:
JSONView.pyと同じディレクトリにJSONView.iniという名前で保存されます。ファイル形式: TOML形式。
内容: プログラム終了時のGUIウィンドウのサイズと位置情報が
geometryキーに保存されます。これにより、次回プログラムを起動した際に、前回のウィンドウ状態が復元されます。例 (JSONView.ini):
geometry = "800x600+100+50"
"800x600"はウィンドウの幅と高さ、"+100+50"はスクリーンの左上からのX軸とY軸のオフセット(位置)を示します。
コマンドラインでの使用例 (Usage)
JSONView.py は、コマンドラインから以下の形式で実行します。
python JSONView.py <infile> [window_size]
<infile>:必須: 表示したいJSONファイルのパスを指定します。
[window_size]:オプション: GUIウィンドウの初期サイズを
WIDTHxHEIGHTの形式で指定します(例:800x600)。この引数が省略された場合、JSONView.iniに保存された設定、またはデフォルトの600x400が使用されます。
コマンドラインでの具体的な使用例
以下の例では、data.json というJSONファイルがあることを前提とします。
data.json の内容:
{
"project": {
"name": "My Awesome Project",
"version": "1.0.0",
"status": "active",
"developers": [
{"id": 101, "name": "Alice Johnson"},
{"id": 102, "name": "Bob Smith"}
]
},
"config": {
"database": {
"host": "localhost",
"port": 5432,
"user": "admin"
},
"api_keys": ["key123", "key456"]
}
}
例1: 基本的な使用法 (JSONファイルのみを指定)
data.json をデフォルトまたはINIファイルで設定されたサイズで開きます。
コマンド:
python JSONView.py data.json
実行結果の説明:
data.json の内容がTkinterウィンドウにツリー形式で表示されます。「Key」列にはJSONオブジェクトのキーやリストのインデックスが表示され、「Value」列には対応する値が表示されます。ネストされたオブジェクトや配列は、展開可能なノードとして表示されます。ウィンドウサイズは、もし JSONView.ini が存在しなければ 600x400 となり、もし JSONView.ini が存在すればその設定が適用されます。
例2: ウィンドウサイズを指定して開く
data.json を特定のウィンドウサイズ (1024x768) で開きます。
コマンド:
python JSONView.py data.json 1024x768
実行結果の説明:
data.json の内容が、幅1024ピクセル、高さ768ピクセルのTkinterウィンドウに表示されます。これにより、より多くの情報を一度に閲覧したり、高解像度ディスプレイに適した表示サイズに調整したりすることができます。プログラム終了時には、この 1024x768 のサイズが JSONView.ini に保存されます。
例3: 不正な引数で実行した場合
引数を指定せずに実行します。
コマンド:
python JSONView.py
実行結果の説明: プログラムは必須の入力ファイルが指定されていないため、以下のようなUsageメッセージを表示して終了します。
Usage: python xml_viewer.py infile window_size
注釈: プログラム内のメッセージは xml_viewer.py と誤記されていますが、実際には JSONView.py として動作します。