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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 14:15:10