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

C# 中如何按ID对JSON数据分组 实现同ID多字段合并为数组

实现方案

你可以通过以下两种主流方式实现需求,可根据项目场景自行选择:


方案1:先反序列化后分组(需定义实体类,可读性高)

  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; }
}
  1. 执行反序列化、分组、序列化操作:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:45:02