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

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存入字典
  • 遍历完成后,将字典的所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:15:08