はじめに
本記事では、Windows フォームアプリでツリービューコントロールを配置し、Jsonデータを表示する方法について説明します。
画面のデザイン
画面には、Buttonコントロールと TreeViewコントロールを貼り付けます。
ButtonコントロールのNameプロパティは「loadJsonData」に、TreeViewコントロールのNameプロパティは「treeViewJson」にします。
Newtonsoft.Jsonをインストールする
WindowsフォームアプリでJsonを簡単に扱えるようにするために、Newtonsoft,Jsonをインストールします。
はじめに、メニューの[ツール]-[NuGet パッケージ マネージャー]-[ソリューションの NuGetパッケージの管理]を選択します。
「NuGetソリューション」が表示されるので「参照」を選択したら、「Json」と入力して検索をします。
一覧から「Newtonsoft.Json」を選択し、インストール先のプロジェクトにチェックを付けます。この例では「JsonTreeView」というプロジェクトにチェックを付けています。
最後に[インストール]ボタンをクリックすると、Newtonsoft.Jsonがインストールされます。
using句の追加
Newtonsoft.Json を使用するために、以下の using句を追加します。
using Newtonsoft.Json; using Newtonsoft.Json.Linq;
Jsonデータ読み込み処理
このアプリでは[Json データの読み込み]ボタンがクリックされたときに Jsonデータを読み込んでツリービューに表示するようにします。
コード例を以下に示します。
/// <summary> /// [Json データの読み込み]ボタンクリック時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void loadJsonButton_Click(object sender, EventArgs e) { // 読み込むJSONデータの作成 string jsonData = @" { ""住所"": { ""郵便番号"": ""012-3456"", ""住所"": ""東京都港区XXX-XXX"", }, ""氏名"": ""Steve Jobs"", ""年齢"": 30, }"; // JSONデータを解析してツリービューに表示します。 perseJsonData(jsonData); }
9〜17行目は、読み込む Jsonデータを作成しています。実際のアプリケーションでは、ファイルから Jsonデータを読み込むような作りにします。
20行目は、Jsonデータを渡して解析し、ツリービューに表示するメソッド perseJsonDataを呼び出している部分です。
Jsonデータの解析
ここでは Jsonデータを解析する showJsonInTreeViewメソッドを作成します。
/// <summary> /// Jsonデータの解析 /// </summary> /// <param name="jsonData">Jsonデータ</param> private void perseJsonData(string jsonData) { // JSONデータを解析してJObjectに変換します。 JObject jsonObject = JObject.Parse(jsonData); // ツリービューをクリアします。 treeViewJson.Nodes.Clear(); // JSONデータをツリービューに表示する再帰関数を呼び出します。 showJsonInTreeView(null, jsonObject); }
showJsonInTreeViewメソッドは、引数として Jsonデータを表す文字列を受け取ります。
受け取ったデータは、Newtonsoft.Json の Linqオブジェクトである JObject.Parseメソッドを使用して解析します(8行目)。解析したデータは JObject型になります。
次にツリービューを初期化します(11行目)。
最後に、解析データをツリービューに渡すためのメソッド
Jsonデータをツリービューに表示する
最後にJsonデータをツリービューに表示するメソッド showJsonInTreeViewを作成します。
/// <summary> /// ツリービューにJsonデータを表示する /// </summary> /// <param name="parentNode"></param> /// <param name="jsonObject"></param> private void showJsonInTreeView(TreeNode parentNode, JObject jsonObject) { foreach (var property in jsonObject.Properties()) { // プロパティ名を取得します。 string propertyName = property.Name; // プロパティの値を取得します。 JToken propertyValue = property.Value; // 新しいノードを作成して親ノードに追加します。 TreeNode newNode = new TreeNode(propertyName); if (propertyValue.Type == JTokenType.Object) { // プロパティの値がオブジェクトの場合、再帰的に処理します。 showJsonInTreeView(newNode, (JObject)propertyValue); } else if (propertyValue.Type == JTokenType.Array) { // プロパティの値が配列の場合、配列の各要素を処理します。 int index = 0; foreach (var item in (JArray)propertyValue) { TreeNode arrayNode = new TreeNode($"[{index}]"); if (item.Type == JTokenType.Object) { showJsonInTreeView(arrayNode, (JObject)item); } else { arrayNode.Nodes.Add(item.ToString()); } newNode.Nodes.Add(arrayNode); index++; } } else { // プロパティの値が単純な値の場合、ノードに値を追加します。 newNode.Nodes.Add(propertyValue.ToString()); } // 親ノードに新しいノードを追加します。 if (parentNode == null) { treeViewJson.Nodes.Add(newNode); } else { parentNode.Nodes.Add(newNode); } } }
showJsonInTreeView
メソッド:- このメソッドは、JSONデータをツリービューに表示するためのメソッドです。
TreeNode
オブジェクトとJObject
オブジェクトを引数として受け取ります。TreeNode
はツリービュー内のノードを表し、JObject
はJSONデータの一部を表します。
foreach
ループ:jsonObject
内の各プロパティを反復処理します。JSONのプロパティはキーと値のペアで構成されています。
- プロパティ名と値の取得:
property.Name
は、プロパティの名前(キー)を取得します。property.Value
は、プロパティの値(バリュー)を取得します。
- 新しいノードの作成:
TreeNode
オブジェクトを作成し、その名前をプロパティ名に設定します。- 新しいノードは、親ノードに追加するための準備をします。
- プロパティの型に応じた処理:
propertyValue
の型に応じて処理を分岐します。- もし
propertyValue
がオブジェクト(JTokenType.Object
)の場合、再帰的にshowJsonInTreeView
メソッドを呼び出してそのオブジェクトを処理します。 - もし
propertyValue
が配列(JTokenType.Array
)の場合、配列内の各要素を処理し、新しいノードに追加します。 - それ以外の場合、単純な値であるため、その値を新しいノードに追加します。
- ノードの追加:
- 新しいノードを親ノードに追加します。
- もし親ノードが
null
の場合、ツリービューのルートノードに追加します。それ以外の場合、親ノードの下に追加します。
このコードの主要なポイントは、JSONデータの階層構造を考慮し、再帰的にツリービューにデータを追加することです。これにより、ネストされたJSONデータも適切に表示されます。
コメント