C#实现JSON通用分层反序列化构建树形视图方案咨询
通用JSON树形视图无限制实现方案
你要的通用实现不需要提前声明数据结构、不需要手动指定树最大深度,核心是用通用动态JSON解析+迭代栈遍历,所有逻辑和JSON具体结构完全解耦,适配任意合法JSON格式。
核心实现逻辑
- 解析阶段:不要将JSON反序列化为你提前定义的强类型实体,直接反序列化为语言内置/通用JSON库提供的动态节点结构(C#对应
JToken/JsonElement、JavaScript对应原生JSON.parse结果、Python对应json.loads生成的dict/list结构),这一步完全跳过预声明类型的要求。 - 遍历阶段:维护一个遍历栈,栈中每个元素存储3个信息:当前待处理的JSON节点、当前节点绑定的树形视图父节点、当前遍历深度。初始化时将JSON根节点、树形视图根控件、深度0压入栈。
- 处理阶段:循环弹出栈顶元素,根据节点类型做对应处理:
- 若当前是对象(键值对结构):遍历对象所有属性,为每个属性名创建树形子节点,将属性值、新建的子节点、深度+1压入栈
- 若当前是数组:按顺序遍历所有数组元素,为每个元素创建带索引标识的树形子节点,将数组元素、新建的子节点、深度+1压入栈
- 若当前是基础值(字符串、数字、布尔值、null):直接在当前节点文本后拼接值内容,作为叶子节点不再入栈
核心代码参考
以下是和具体UI框架、语言无关的核心逻辑伪代码,可以直接迁移到你的技术栈中:
// 初始化遍历栈 Stack<(JsonNode currentJson, TreeNode parentUi, int depth)> traverseStack = new(); // 根节点入栈 JsonNode rootJson = GenericJsonParse(yourJsonString); TreeNode rootUi = treeView.AddNode("JSON Root"); traverseStack.Push((rootJson, rootUi, 0)); while (traverseStack.Count > 0) { var (json, uiNode, depth) = traverseStack.Pop(); switch(json.NodeType) { case JsonType.Object: foreach(var (propName, propValue) in json.EnumerateObject()) { var childUi = uiNode.AddNode(propName); traverseStack.Push((propValue, childUi, depth + 1)); } break; case JsonType.Array: int idx = 0; foreach(var item in json.EnumerateArray()) { var childUi = uiNode.AddNode($"[{idx}]"); traverseStack.Push((item, childUi, depth + 1)); idx++; } break; case JsonType.Primitive: uiNode.Text += $": {json.GetRawText()}"; break; } }
适配说明
你提供的游戏配置JSON可以直接用这套逻辑处理,会自动展开根节点下的arcanePrefs、arcaneControls两个数组,再逐层遍历每个配置项、按键绑定的属性,最终生成的结构和你预期的树形效果完全一致,不需要针对该JSON做任何特殊适配。
这套方案不存在深度限制,哪怕JSON嵌套上百层也可以正常解析;用迭代栈而非纯递归实现,也可以避免极深结构导致的调用栈溢出问题。
内容的提问来源于stack exchange,提问作者Atlas Tabula
相关产品推荐
相关产品推荐

