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

C#实现两个JSON对象对比并返回差异结果的技术问询

C# JSON对象对比差异实现方案

可以使用Newtonsoft.Json(Json.NET)库来实现两个JSON对象的属性差异对比,下面是完整的实现代码,支持返回差异列表JSON,同时提供覆盖度量等额外统计数据。

实现步骤

  • 引用Newtonsoft.Json NuGet包(版本建议13.x及以上)
  • 将JSON字符串反序列化为JObject以便遍历属性
  • 遍历第一个JSON的所有属性,与第二个JSON的对应属性值对比
  • 收集属性值不同的项,同时统计总属性数、差异属性数等度量数据

完整代码

using Newtonsoft.Json.Linq;
using System.Linq;

public static class JsonComparer
{
    public static string CompareJson(string json1, string json2)
    {
        var obj1 = JObject.Parse(json1);
        var obj2 = JObject.Parse(json2);
        
        var differences = new JObject();
        int totalProperties = obj1.Properties().Count();
        int changedProperties = 0;
        
        // 遍历第一个JSON的所有属性进行对比
        foreach (var prop in obj1.Properties())
        {
            var propName = prop.Name;
            var value1 = prop.Value;
            var value2 = obj2.SelectToken(propName);
            
            // 处理属性存在但值不同的情况
            if (value2 != null && !JToken.DeepEquals(value1, value2))
            {
                differences[propName] = new JArray(value1, value2);
                changedProperties++;
            }
            // 可选:处理第一个JSON有但第二个没有的属性
            // else if (value2 == null)
            // {
            //     differences[propName] = new JArray(value1, null);
            //     changedProperties++;
            // }
        }
        
        // 添加覆盖度量数据
        var result = new JObject();
        result["differences"] = differences;
        result["metrics"] = new JObject
        {
            ["totalProperties"] = totalProperties,
            ["changedProperties"] = changedProperties,
            ["changeRate"] = totalProperties > 0 ? (double)changedProperties / totalProperties : 0
        };
        
        return result.ToString();
    }
}

// 使用示例
public class Program
{
    public static void Main()
    {
        var json1 = @"{
""name"": ""JohnRob"",
""nickname"":""John"",
""age"": 20,
""married"": false
}";
        var json2 = @"{
""name"": ""JohnRob"",
""nickname"":""John"",
""age"": 22,
""married"": true
}";
        
        var comparisonResult = JsonComparer.CompareJson(json1, json2);
        System.Console.WriteLine(comparisonResult);
    }
}

输出结果

运行上述代码后,输出的JSON包含差异列表和度量数据:

{
  "differences": {
    "age": [
      20,
      22
    ],
    "married": [
      false,
      true
    ]
  },
  "metrics": {
    "totalProperties": 4,
    "changedProperties": 2,
    "changeRate": 0.5
  }
}

扩展说明

  • 如果需要处理嵌套JSON对象的差异,可以递归遍历JObject的子属性,修改对比逻辑实现深度对比
  • 若要处理数组元素的差异,需额外编写数组对比逻辑(比如按索引或元素内容匹配)
  • 可以根据需求调整差异的展示格式,比如只显示变化后的值,或添加属性类型信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:12:04