如何将层级JSON数据转层级表格及反序列化为C# nodes类?
针对你的两个问题,我来一步步给你解答:
1. 层级JSON转换为层级表格的方法
层级JSON转表格的核心是递归遍历所有节点,记录每个节点的层级关系,然后用可视化的方式(比如缩进、层级符号)在表格中体现层级。以下是具体步骤和示例:
实现思路
- 递归遍历JSON的每个节点,为每个节点记录:层级深度、父节点名称、自身ID和名称
- 用缩进字符(比如多个空格)或层级符号(比如
├─、└─)区分不同层级的节点 - 将所有节点的信息整理成表格行,最终生成结构化的层级表格
示例转换
以你提供的JSON为例,转换后的层级表格可以是这样:
| 节点路径 | ID | 名称 |
|---|---|---|
| user1 | 15 | user1 |
| ├─ user2 | 22 | user2 |
| │ ├─ user3 | 34 | user3 |
| │ │ ├─ user4 | 43 | user4 |
| │ │ └─ user5 | 54 | user5 |
| │ └─ user6 | 65 | user6 |
| └─ user7 | 72 | user7 |
或者更简洁的层级编号样式:
| 层级 | ID | 名称 | 父节点名称 |
|---|---|---|---|
| 1 | 15 | user1 | - |
| 2 | 22 | user2 | user1 |
| 3 | 34 | user3 | user2 |
| 4 | 43 | user4 | user3 |
| 4 | 54 | user5 | user3 |
| 3 | 65 | user6 | user2 |
| 2 | 72 | user7 | user1 |
代码实现思路(伪代码)
如果需要用代码自动转换,可以写一个递归函数遍历节点:
def traverse_json(node, level=1, parent_name="-", result=[]): # 记录当前节点信息 result.append({ "level": level, "id": node["id"], "name": node["name"], "parent_name": parent_name }) # 递归处理子节点 if "children" in node and node["children"]: for child in node["children"]: traverse_json(child, level+1, node["name"], result) return result
之后将生成的结果列表转换为表格即可。
2. C#中将层级JSON反序列化为
nodes类实例的方法 首先注意你提供的JSON属于非标准JSON:属性名没有加双引号,字符串值用的是单引号。C#的标准序列化库(比如System.Text.Json)默认只支持标准JSON,所以推荐用Newtonsoft.Json(Json.NET)来处理,它对非标准JSON的兼容性更好。
步骤1:准备环境
如果你的项目还没安装Newtonsoft.Json,通过NuGet包管理器安装:
- 右键项目 → 管理NuGet程序包 → 搜索
Newtonsoft.Json→ 安装最新版本
步骤2:反序列化代码示例
using Newtonsoft.Json; using System.Collections.Generic; // 你的类定义(建议修改类名为大写开头的Nodes,符合C#编码规范) public class nodes { public int id { get; set; } public string name { get; set; } public List<nodes> children { get; set; } } class Program { static void Main() { // 你的非标准JSON字符串 string json = @"{ id: 15, name: 'user1', children: [ { id: 22, name: 'user2', children: [ { id: 34, name: 'user3', children: [ { id: 43, name: 'user4', children: [] }, { id: 54, name: 'user5', children: [] } ] }, { id: 65, name: 'user6', children: [] } ] }, { id: 72, name: 'user7', children: [] } ] }"; // 配置序列化器,允许无引号的属性名和单引号字符串 var serializerSettings = new JsonSerializerSettings { AllowUnquotedFieldNames = true, AllowSingleQuotes = true }; // 反序列化为nodes实例 nodes rootNode = JsonConvert.DeserializeObject<nodes>(json, serializerSettings); // 验证结果(可选) System.Console.WriteLine($"Root Node: ID={rootNode.id}, Name={rootNode.name}"); } }
如果必须使用System.Text.Json
如果不想依赖第三方库,需要先将非标准JSON转换为标准格式:
- 将所有单引号
'替换为双引号" - 为所有属性名加上双引号(比如把
id:替换为"id":)
之后就可以用标准方法反序列化:
using System.Text.Json; // 转换后的标准JSON字符串 string standardJson = @"{ ""id"": 15, ""name"": ""user1"", ""children"": [ ... ] }"; nodes rootNode = JsonSerializer.Deserialize<nodes>(standardJson);
内容的提问来源于stack exchange,提问作者Sandeep Thomas




