[Windowsフォームアプリ] Jsonデータをツリービューに表示する方法1

スポンサーリンク

はじめに

本記事では、Windows フォームアプリでツリービューコントロールを配置し、Jsonデータを表示する方法について説明します。

実行例

実行例

画面のデザイン

画面には、Buttonコントロールと TreeViewコントロールを貼り付けます。

ButtonコントロールのNameプロパティは「loadJsonData」に、TreeViewコントロールのNameプロパティは「treeViewJson」にします。

画面デザイン

画面デザイン

 

Newtonsoft.Jsonをインストールする

WindowsフォームアプリでJsonを簡単に扱えるようにするために、Newtonsoft,Jsonをインストールします。

はじめに、メニューの[ツール]-[NuGet パッケージ マネージャー]-[ソリューションの NuGetパッケージの管理]を選択します。

NuGetパッケージの管理

NuGetパッケージの管理

「NuGetソリューション」が表示されるので「参照」を選択したら、「Json」と入力して検索をします。

一覧から「Newtonsoft.Json」を選択し、インストール先のプロジェクトにチェックを付けます。この例では「JsonTreeView」というプロジェクトにチェックを付けています。

最後に[インストール]ボタンをクリックすると、Newtonsoft.Jsonがインストールされます。

Newtonsoft.Jsonのインストール

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);
        }
    }
}
  1. showJsonInTreeView メソッド:
    • このメソッドは、JSONデータをツリービューに表示するためのメソッドです。
    • TreeNode オブジェクトと JObject オブジェクトを引数として受け取ります。
    • TreeNode はツリービュー内のノードを表し、JObject はJSONデータの一部を表します。
  2. foreach ループ:
    • jsonObject 内の各プロパティを反復処理します。JSONのプロパティはキーと値のペアで構成されています。
  3. プロパティ名と値の取得:
    • property.Name は、プロパティの名前(キー)を取得します。
    • property.Value は、プロパティの値(バリュー)を取得します。
  4. 新しいノードの作成:
    • TreeNode オブジェクトを作成し、その名前をプロパティ名に設定します。
    • 新しいノードは、親ノードに追加するための準備をします。
  5. プロパティの型に応じた処理:
    • propertyValue の型に応じて処理を分岐します。
    • もし propertyValue がオブジェクト(JTokenType.Object)の場合、再帰的に showJsonInTreeView メソッドを呼び出してそのオブジェクトを処理します。
    • もし propertyValue が配列(JTokenType.Array)の場合、配列内の各要素を処理し、新しいノードに追加します。
    • それ以外の場合、単純な値であるため、その値を新しいノードに追加します。
  6. ノードの追加:
    • 新しいノードを親ノードに追加します。
    • もし親ノードが null の場合、ツリービューのルートノードに追加します。それ以外の場合、親ノードの下に追加します。

このコードの主要なポイントは、JSONデータの階層構造を考慮し、再帰的にツリービューにデータを追加することです。これにより、ネストされたJSONデータも適切に表示されます。

Please follow and like us:

コメント

タイトルとURLをコピーしました