C#中如何基于共有id合并多个JArray并导出为JSON文件
C# 基于id合并多个JArray实现方案
前置依赖
你需要先安装Newtonsoft.Json(Json.NET)Nuget包,这是.NET生态下最常用的JSON处理库,JArray、JObject类型都来自这个库。
核心实现逻辑
- 初始化一个
Dictionary<string, JObject>,以id为键存储每个id对应的合并后对象 - 遍历所有待合并的JArray,再遍历每个JArray内的JObject元素:
- 提取当前JObject的
id字段值作为字典键 - 如果字典中已存在该id:将当前JObject的属性合并到字典中已有的JObject上,默认重复属性会用新值覆盖旧值
- 如果字典中不存在该id:直接将当前JObject存入字典
- 提取当前JObject的
- 遍历完成后,将字典的所有Value转为JArray,再序列化为格式化的JSON写入目标文件即可
完整代码示例
using Newtonsoft.Json; using Newtonsoft.Json.Linq; // 这里是你示例中的3个待合并JArray,实际使用时可以从文件/接口等来源加载 JArray arr1 = JArray.Parse(@"[ {""id"" : ""222"", ""name"" : ""second""}, {""id"" : ""111"", ""name"" : ""first""}, {""id"" : ""333"", ""name"" : ""third""} ]"); JArray arr2 = JArray.Parse(@"[ {""id"" : ""111"", ""info"" : ""one one one""}, {""id"" : ""222"", ""info"" : ""two two two""}, {""id"" : ""333"", ""info"" : ""three three three""} ]"); JArray arr3 = JArray.Parse(@"[ {""id"" : ""333"", ""number"" : ""3"", ""call"" : ""three""}, {""id"" : ""222"", ""number"" : ""2"", ""call"" : ""two""}, {""id"" : ""111"", ""number"" : ""1"", ""call"" : ""one""} ]"); // 把所有待合并的JArray放到一个列表里统一处理 List<JArray> allArrays = new List<JArray> { arr1, arr2, arr3 }; Dictionary<string, JObject> mergeDic = new Dictionary<string, JObject>(); // 合并逻辑 foreach (var array in allArrays) { foreach (JObject obj in array) { string id = obj["id"].ToString(); if (mergeDic.ContainsKey(id)) { // 合并属性,可通过JsonMergeSettings自定义合并规则 mergeDic[id].Merge(obj, new JsonMergeSettings { // 空值不覆盖原有属性 MergeNullValueHandling = MergeNullValueHandling.Ignore, // 如果对象内有数组属性,设置数组合并规则,Union表示取并集 MergeArrayHandling = MergeArrayHandling.Union }); } else { mergeDic.Add(id, obj); } } } // 转成最终的JArray JArray resultArray = new JArray(mergeDic.Values); // 输出到JSON文件 string outputJson = resultArray.ToString(Formatting.Indented); File.WriteAllText(@"D:\合并结果.json", outputJson); // 控制台打印验证 Console.WriteLine(outputJson);
合并结果示例
[ { "id": "222", "name": "second", "info": "two two two", "number": "2", "call": "two" }, { "id": "111", "name": "first", "info": "one one one", "number": "1", "call": "one" }, { "id": "333", "name": "third", "info": "three three three", "number": "3", "call": "three" } ]
自定义调整说明
- 如果需要调整属性覆盖优先级,只要修改
allArrays列表中JArray的顺序即可,越靠后的JArray中的属性优先级越高,重复属性会覆盖前面的 - 如果不需要覆盖已有的旧属性,可以在Merge之前遍历当前JObject的属性,判断
mergeDic[id]中不存在该属性再添加即可
内容的提问来源于stack exchange,提问作者ggu mini
相关产品推荐
相关产品推荐

