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

如何在C#递归菜单树生成函数中移除空List属性?

解决递归菜单树中空List属性的移除问题

这个问题我之前做菜单树功能时也碰到过——底层明明没有子菜单的节点,序列化后却带着个空的List: []字段,JSON显得特别冗余。下面给你两种实用的解决方案,你可以根据自己的场景选择:

方案一:修改递归逻辑+配置序列化忽略Null值

适合需要保持强类型返回的场景,步骤清晰易维护:

1. 调整Menu类定义

先确保List属性默认是null,不要在声明或构造函数里初始化空列表:

public class Menu
{
    public int ID { get; set; }
    public int? IDParent { get; set; }
    public string text { get; set; }
    // 不要在这里初始化List,让它默认为null
    public List<Menu> List { get; set; }
}

2. 修改递归函数逻辑

创建Menu对象时先判断子节点是否存在,只有有子节点时才给List属性赋值:

private List<Menu> GetMenuTree(List<Menu> list, int? idparent)
{
    return list.Where(x => x.IDParent == idparent).Select(x => 
    {
        // 先获取当前节点的子节点列表
        var childMenuList = GetMenuTree(list, x.ID);
        
        var currentMenu = new Menu()
        {
            ID = x.ID,
            IDParent = x.IDParent,
            text = x.text
        };
        
        // 仅当子节点不为空时,才赋值List属性
        if (childMenuList.Any())
        {
            currentMenu.List = childMenuList;
        }
        
        return currentMenu;
    }).ToList();
}

3. 配置序列化忽略Null属性

如果用Newtonsoft.Json(Json.NET)序列化,添加NullValueHandling.Ignore配置,这样List为null的属性就不会被序列化出来:

var serializerSettings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore
};

var menuTreeJson = JsonConvert.SerializeObject(yourMenuTree, serializerSettings);

如果用System.Text.Json,配置方式类似:

var serializerOptions = new JsonSerializerOptions
{
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};

var menuTreeJson = JsonSerializer.Serialize(yourMenuTree, serializerOptions);

方案二:使用匿名类型动态生成(无需修改序列化配置)

如果不需要强类型返回结果,只想直接生成干净的JSON,可以用匿名类型构造,仅在有子节点时包含List字段:

private List<object> GetMenuTree(List<Menu> list, int? idparent)
{
    return list.Where(x => x.IDParent == idparent).Select(x => 
    {
        var childMenuList = GetMenuTree(list, x.ID);
        
        // 根据子节点是否存在,返回不同结构的匿名对象
        if (childMenuList.Any())
        {
            return new 
            {
                x.ID,
                x.IDParent,
                x.text,
                List = childMenuList
            };
        }
        else
        {
            return new 
            {
                x.ID,
                x.IDParent,
                x.text
            };
        }
    }).ToList<object>();
}

这种方式序列化后的JSON会自动去掉空List字段,因为底层节点的匿名对象根本没有这个属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:20:29