如何在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
相关产品推荐
相关产品推荐

