You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将层级JSON数据转层级表格及反序列化为C# nodes类?

针对你的两个问题,我来一步步给你解答:


1. 层级JSON转换为层级表格的方法

层级JSON转表格的核心是递归遍历所有节点,记录每个节点的层级关系,然后用可视化的方式(比如缩进、层级符号)在表格中体现层级。以下是具体步骤和示例:

实现思路

  • 递归遍历JSON的每个节点,为每个节点记录:层级深度、父节点名称、自身ID和名称
  • 缩进字符(比如多个空格)或层级符号(比如├─└─)区分不同层级的节点
  • 将所有节点的信息整理成表格行,最终生成结构化的层级表格

示例转换

以你提供的JSON为例,转换后的层级表格可以是这样:

节点路径ID名称
user115user1
├─ user222user2
│ ├─ user334user3
│ │ ├─ user443user4
│ │ └─ user554user5
│ └─ user665user6
└─ user772user7

或者更简洁的层级编号样式:

层级ID名称父节点名称
115user1-
222user2user1
334user3user2
443user4user3
454user5user3
365user6user2
272user7user1

代码实现思路(伪代码)

如果需要用代码自动转换,可以写一个递归函数遍历节点:

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转换为标准格式:

  1. 将所有单引号'替换为双引号"
  2. 为所有属性名加上双引号(比如把id:替换为"id":
    之后就可以用标准方法反序列化:
using System.Text.Json;

// 转换后的标准JSON字符串
string standardJson = @"{ ""id"": 15, ""name"": ""user1"", ""children"": [ ... ] }";
nodes rootNode = JsonSerializer.Deserialize<nodes>(standardJson);

内容的提问来源于stack exchange,提问作者Sandeep Thomas

火山引擎 最新活动