C# 中如何按ID对JSON数据分组 实现同ID多字段合并为数组
实现方案
你可以通过以下两种主流方式实现需求,可根据项目场景自行选择:
方案1:先反序列化后分组(需定义实体类,可读性高)
- 先定义对应的实体结构:
// 原始JSON对应的实体类 public class OriginalItem { public string Id { get; set; } public string Profit { get; set; } public string Telephone { get; set; } public string Email { get; set; } } // 分组后输出的实体类 public class GroupedItem { public string Id { get; set; } public List<string> Profits { get; set; } public List<string> Telephones { get; set; } public List<string> Emails { get; set; } }
- 执行反序列化、分组、序列化操作:
using Newtonsoft.Json; using System.Linq; // 替换为你的原始JSON字符串 string originalJson = "[{ \"Id\": \"1\", \"Profit\": \"33.332999999999998\", \"Telephone\": \"123\", \"Email\": \"user1@testmail.com\" }, { \"Id\": \"1\", \"Profit\": \"21.21\", \"Telephone\": \"43\", \"Email\": \"user11@testmail.com\" }, { \"Id\": \"2\", \"Profit\": \"49.000999999999998\", \"Telephone\": \"22\", \"Email\": \"user2@testmail.com\" }, { \"Id\": \"2\", \"Profit\": \"10.1\", \"Telephone\": \"876\", \"Email\": \"user22@testmail.com\" }]"; // 反序列化为原始对象集合 var originalList = JsonConvert.DeserializeObject<List<OriginalItem>>(originalJson); // 按Id分组,投影为目标结构 var groupedList = originalList .GroupBy(x => x.Id) .Select(g => new GroupedItem { Id = g.Key, Profits = g.Select(x => x.Profit).ToList(), Telephones = g.Select(x => x.Telephone).ToList(), Emails = g.Select(x => x.Email).ToList() }) .ToList(); // 序列化为最终JSON string resultJson = JsonConvert.SerializeObject(groupedList);
方案2:直接操作JSON节点(无需定义实体类,灵活度高)
如果你不想额外定义实体类,可以直接用Newtonsoft.Json提供的Linq to JSON API处理:
using Newtonsoft.Json.Linq; // 替换为你的原始JSON字符串 string originalJson = "你的原始JSON字符串"; JArray originalArr = JArray.Parse(originalJson); var groupedArr = new JArray( originalArr.GroupBy(x => (string)x["Id"]) .Select(g => new JObject { ["Id"] = g.Key, ["Profits"] = new JArray(g.Select(x => x["Profit"])), ["Telephones"] = new JArray(g.Select(x => x["Telephone"])), ["Emails"] = new JArray(g.Select(x => x["Email"])) }) ); string resultJson = groupedArr.ToString();
可选优化方案:直接处理DataTable
不需要先把DataTable序列化为JSON再处理,直接在DataTable阶段完成分组性能更高:
using Newtonsoft.Json; using System.Data; using System.Linq; // dt是你从Excel读取得到的DataTable var groupedResult = dt.AsEnumerable() .GroupBy(row => row.Field<string>("Id")) .Select(g => new { Id = g.Key, Profits = g.Select(row => row.Field<string>("Profit")).ToList(), Telephones = g.Select(row => row.Field<string>("Telephone")).ToList(), Emails = g.Select(row => row.Field<string>("Email")).ToList() }) .ToList(); // 直接序列化得到目标JSON string resultJson = JsonConvert.SerializeObject(groupedResult);
内容的提问来源于stack exchange,提问作者nitish
相关产品推荐
相关产品推荐

