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

スポンサーリンク

はじめに

前回の記事では、コード内に埋め込んだJsonデータを読み込んでツリービューに表示するアプリの作成方法について説明しました。

今回は、任意のJsonデータファイルを読み込んでツリービューに表示できるように変更します。

実行例

実行例

実行例

実行例

ファイル読み込み処理を作成する

前回作成した[Json データの読み込み]ボタンクリック時の処理を以下のように変更します。

ファイルダイアログを表示して、JSONファイルを選択できるようにします。

選択されたJSONファイルを読み込み、perseJsonData メソッドを呼び出してJSONデータを解析します。

/// <summary>
/// [Json データの読み込み]ボタンクリック時の処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void loadJsonButton_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "JSONファイル|*.json";

    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        try
        {
            string jsonFilePath = openFileDialog.FileName;
            string jsonContent = File.ReadAllText(jsonFilePath);

            // JSONデータを解析してツリービューに表示
            perseJsonData(jsonContent);
        }
        catch (Exception ex)
        {
            MessageBox.Show("JSONファイルの読み込みエラー: " + ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

Jsonデータの解析

ここでは Jsonデータを解析する perseJsonDataメソッドを作成します。

はじめに、新しいデータを表示する前にツリービューをクリアします。

次に、JToken.Parse メソッドを使用してJSONデータを解析し、データ型を確認します。
JSONデータがオブジェクト(JTokenType.Object)なのか、配列(JTokenType.Array)なのかで、処理を分岐しています。

オブジェクトの場合は、showJsonInTreeView メソッドを呼び出して JSONデータをツリービューに表示します。

配列の場合は、要素の数だけループしながらshowJsonInTreeView メソッドを呼び出して JSONデータをツリービューに表示します。

/// <summary>
/// JSONデータを解析する
/// </summary>
/// <param name="jsonData">JSONデータ</param>
private void perseJsonData(string jsonData)
{
    // ツリービューをクリア
    treeViewJson.Nodes.Clear();

    JToken jsonToken = JToken.Parse(jsonData);

    if (jsonToken.Type == JTokenType.Object)
    {
        // JSONデータがオブジェクトの場合
        JObject jsonObject = (JObject)jsonToken;
        TreeNode rootNode = new TreeNode("JSONデータ");
        showJsonInTreeView(rootNode, jsonObject);
        treeViewJson.Nodes.Add(rootNode);
    }
    else if (jsonToken.Type == JTokenType.Array)
    {
        // JSONデータが配列の場合
        JArray jsonArray = (JArray)jsonToken;
        TreeNode rootNode = new TreeNode("JSONデータ");
        for (int i = 0; i < jsonArray.Count; i++)
        {
            TreeNode arrayNode = new TreeNode($"Item {i}");
            showJsonInTreeView(arrayNode, (JObject)jsonArray[i]);
            rootNode.Nodes.Add(arrayNode);
        }
        treeViewJson.Nodes.Add(rootNode);
    }
}

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 の場合、ツリービューのルートノードに追加します。それ以外の場合、親ノードの下に追加します。
Please follow and like us:

コメント

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