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

