You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将WPF TreeView反向转换为原JSON结构

将WPF TreeView转换回原JSON结构的解决方案

我有如下JSON结构:

{
    "test1.1": {
        "test2.2": {},
        "test2.3": {},
        "test2.4": {
            "test3.1": {},
            "test3.2": {},
            "test3.3": {}
        },
        "test2.5": {
            "test4.1": {},
            "test4.2": {},
            "test4.3": {}
        }
    }
}

已经在WPF的TreeView中成功展示该结构,现在需要把TreeView转换回和原结构一致的JSON,但当前实现的代码无法得到正确结果。

当前错误实现代码

private string ConvertTreeViewToJson(TreeView treeView)
{
    List<object> treeViewItems = new List<object>();
    foreach (TreeViewItem item in treeView.Items)
    {
        treeViewItems.Add(Recursion(item));
    }

    return JsonConvert.SerializeObject(treeViewItems, Formatting.Indented);
}

private object Recursion(TreeViewItem item)
{
    var node = new List<object>() {item.Header};

    if (item.HasItems)
    {
        List<object> children = new List<object>();
        foreach (TreeViewItem childItem in item.Items)
        {
            children.Add(Recursion(childItem));
        }
        node.Add(children);
    }

    return node;
}

当前错误输出结果

[["test1.1",[["test2.2"],["test2.3"],["test2.4",[["test3.1"],["test3.2"],["test3.3"]]],["test2.5",[["test4.1"],["test4.2"],["test4.3"]]]]]]

正确解决方案

问题出在你用List<object>存储节点,而原JSON是键值对对象结构,不是数组。需要改用Dictionary<string, object>来模拟JSON的对象结构,每个节点的Header作为键,子节点(或空对象)作为对应的值。

正确实现代码

using Newtonsoft.Json;
using System.Collections.Generic;
using System.Windows.Controls;

private string ConvertTreeViewToJson(TreeView treeView)
{
    var rootDictionary = new Dictionary<string, object>();
    foreach (TreeViewItem rootItem in treeView.Items)
    {
        rootDictionary.Add(rootItem.Header.ToString(), ProcessTreeNode(rootItem));
    }
    return JsonConvert.SerializeObject(rootDictionary, Formatting.Indented);
}

private object ProcessTreeNode(TreeViewItem node)
{
    var childDictionary = new Dictionary<string, object>();
    foreach (TreeViewItem childNode in node.Items)
    {
        if (childNode.HasItems)
        {
            // 子节点有子项,递归生成子对象
            childDictionary.Add(childNode.Header.ToString(), ProcessTreeNode(childNode));
        }
        else
        {
            // 子节点无后续项,对应空对象
            childDictionary.Add(childNode.Header.ToString(), new { });
        }
    }
    // 节点无子女时返回空对象,否则返回生成的键值对字典
    return childDictionary.Count == 0 ? new { } : childDictionary;
}

代码说明

  1. 用Dictionary<string, object>对应JSON的对象结构,完美匹配原JSON的键值对格式。
  2. 递归处理每个节点:有子节点就继续递归生成子字典,没有子节点就添加空对象new { }。
  3. 根节点直接用字典存储,避免了原代码中多余的数组包裹,最终输出和原JSON结构完全一致。

内容的提问来源于stack exchange,提问作者Hannes H.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:42:38