C#中如何对比两个JSON并找出后者的新增差异元素
现有代码的核心问题
你当前的代码存在两个逻辑错误,导致无法正确识别新增元素:
- 内层循环的匹配状态没有做中断处理,就算前面已经匹配到了相同的
title,后续遍历到jsonOne中其他不匹配的元素时,还是会把check重置为false,最终check的值只等于当前元素和jsonOne最后一个元素的对比结果,完全达不到判重效果 - 没有处理JSON节点为空的边界情况,一旦某条数据缺失
contentFields或title节点,会直接抛出空引用异常
修复方案
方案1:最小改动适配原有逻辑
只需要在内层循环匹配到相同值后直接跳出循环,避免后续遍历重置匹配状态即可:
foreach (var item in jsonTwo["contentItems"]) { bool check = false; foreach (var item2 in jsonOne["contentItems"]) { if (item["contentFields"]?["title"]?.ToString() == item2["contentFields"]?["title"]?.ToString()) { check = true; // 匹配到就直接跳出内层循环,不需要继续遍历 break; } } if (!check) { Console.WriteLine(item["contentFields"]["title"].ToString()); } }
方案2:更高效的LINQ写法
如果项目允许使用LINQ,可以先把jsonOne中所有的title提取出来转成哈希集合做快速判重,时间复杂度从O(n*m)降到O(n+m),数据量越大性能优势越明显:
// 提前提取jsonOne中所有有效title存入哈希集 var existingTitles = jsonOne["contentItems"] .Select(x => x["contentFields"]?["title"]?.ToString()) .Where(x => !string.IsNullOrEmpty(x)) .ToHashSet(); // 筛选jsonTwo中title不在哈希集内的新增元素 var addedItems = jsonTwo["contentItems"] .Where(x => !existingTitles.Contains(x["contentFields"]?["title"]?.ToString())) .ToList(); // 输出新增元素的title foreach (var item in addedItems) { Console.WriteLine(item["contentFields"]["title"].ToString()); }
注意:上述代码默认使用Newtonsoft.Json(Json.NET)库,如果使用的是System.Text.Json,把节点取值语法对应调整为
GetProperty()相关方法即可。
内容的提问来源于stack exchange,提问作者imsocontigo
相关产品推荐
相关产品推荐

