C#如何从数据库字符串生成指定结构JSON?求解data数组构建方法
C#实现按Email+Link分组并生成指定JSON结构
这问题核心就是按Email和Link的组合做分组,把对应的Data项聚合到数组里,我给你写个完整的实现方案:
步骤拆解
- 解析原始字符串,拆分出每个条目的Email、Link、Data字段
- 按Email+Link的组合对条目分组
- 将分组结果序列化为目标JSON格式
完整代码示例
首先需要引入JSON序列化库,这里用常用的Newtonsoft.Json(也可以用.NET自带的System.Text.Json,代码稍作调整即可)。
1. 定义模型(可选,也可以用匿名类型)
如果需要强类型约束的话,可以先定义对应的类:
// 单个分组后的日志条目 public class LogItem { public string email { get; set; } public string link { get; set; } public List<string> data { get; set; } } // 根对象 public class LogRoot { public List<LogItem> log { get; set; } }
2. 处理逻辑与序列化
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // 原始输入数据 string rawInput = "email1 link1 data1、email1 link1 data2、email1 link2 data3、email2 link3 data4"; // 1. 拆分并解析每个条目 var parsedEntries = rawInput.Split('、') // 按中文顿号拆分每个条目 .Select(entry => { // 按空格拆分每个条目里的字段 var parts = entry.Split(' ', StringSplitOptions.RemoveEmptyEntries); // 加入格式验证,避免字段数量不对的情况 if (parts.Length != 3) { throw new FormatException($"无效的条目格式:{entry}"); } return new { Email = parts[0], Link = parts[1], Data = parts[2] }; }); // 2. 按Email+Link组合分组,聚合Data到数组 var groupedItems = parsedEntries.GroupBy(e => new { e.Email, e.Link }) .Select(group => new LogItem { email = group.Key.Email, link = group.Key.Link, data = group.Select(item => item.Data).ToList() }); // 3. 组装成目标结构并序列化为JSON var logRoot = new LogRoot { log = groupedItems.ToList() }; string jsonResult = JsonConvert.SerializeObject(logRoot, Formatting.Indented); // 输出结果 Console.WriteLine(jsonResult); } }
关键说明
- 分组逻辑:用
GroupBy时,键选择匿名类型new { e.Email, e.Link },C#的匿名类型会自动按属性值进行相等比较,正好满足“相同Email+相同Link为一组”的需求。 - 数据聚合:每个分组里通过
group.Select(item => item.Data).ToList()把所有对应的Data收集成列表,序列化后就是JSON数组。 - 格式验证:加入了对条目字段数量的检查,避免原始数据格式错误导致的索引越界异常。
运行这段代码后,输出的JSON就是你需要的结构:
{ "log": [ { "email": "email1", "link": "link1", "data": [ "data1", "data2" ] }, { "email": "email1", "link": "link2", "data": [ "data3" ] }, { "email": "email2", "link": "link3", "data": [ "data4" ] } ] }
内容的提问来源于stack exchange,提问作者Ирина Скорикова
相关产品推荐
相关产品推荐

