如何将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; }
代码说明
- 用
Dictionary<string, object>对应JSON的对象结构,完美匹配原JSON的键值对格式。 - 递归处理每个节点:有子节点就继续递归生成子字典,没有子节点就添加空对象
new { }。 - 根节点直接用字典存储,避免了原代码中多余的数组包裹,最终输出和原JSON结构完全一致。
内容的提问来源于stack exchange,提问作者Hannes H.
相关产品推荐
相关产品推荐

