如何修改C#递归遍历JObject逻辑,仅检测同层级title重复
仅检测JObject同一层级节点的title字段重复(Newtonsoft.Json实现)
核心思路很明确:放弃全局收集所有title的递归方式,改为逐层级校验——只在当前节点的children数组范围内检查同级节点的title是否重复,校验完当前层级后,再递归处理每个子节点的children数组,完全不跨层级比对。
实现代码
using Newtonsoft.Json.Linq; using System.Collections.Generic; using System.Linq; public static class JObjectTitleChecker { // 检查所有层级的同级节点title重复,返回重复的title列表(每个层级的重复项单独记录) public static List<string> CheckSameLevelTitleDuplicates(JObject root) { var duplicateTitles = new List<string>(); // 处理根节点的子节点层级 CheckChildrenLevel(root, duplicateTitles); return duplicateTitles; } private static void CheckChildrenLevel(JToken parentNode, List<string> duplicateTitles) { // 获取当前节点的children数组 var children = parentNode["children"] as JArray; if (children == null || children.Count == 0) return; // 提取当前层级所有节点的有效title值 var levelTitles = children .Select(child => child["title"]?.ToString()) .Where(title => !string.IsNullOrEmpty(title)) .ToList(); // 筛选当前层级重复的title var duplicates = levelTitles .GroupBy(t => t) .Where(g => g.Count() > 1) .Select(g => g.Key) .Distinct() .ToList(); if (duplicates.Any()) { duplicateTitles.AddRange(duplicates.Select(t => $"同级节点重复title: {t}")); } // 递归处理每个子节点的下一级层级 foreach (var child in children) { CheckChildrenLevel(child, duplicateTitles); } } }
关键逻辑说明
- 层级隔离:每次仅针对当前父节点下的
children数组做校验,所有重复判断都局限在该层级内,不会跨层级比对不同节点的title。 - 递归向下遍历:当前层级校验完成后,再逐个处理子节点的
children数组,确保每个层级都被独立检查。 - 空值容错:自动过滤没有
title字段或title为空的节点,避免无效值干扰校验结果。
使用示例
假设你有如下JSON结构:
{ "title": "根节点", "children": [ {"title": "节点A", "children": [{"title": "节点A"}]}, {"title": "节点B"}, {"title": "节点A"} ] }
调用CheckSameLevelTitleDuplicates后,会检测到根节点子层级中的"节点A"重复,而子节点内部的"节点A"与根层级的"节点A"属于不同层级,不会被判定为重复。
内容的提问来源于stack exchange,提问作者Selaka Nanayakkara
相关产品推荐
相关产品推荐

