如何在C#中将分隔符格式的DataRow转换为键值对结构?
解决方案:C# 转换DataRow风格的JSON为键值对数组
我来帮你搞定这个转换需求!核心思路是先提取第一行的列名,然后遍历后续每一行的数据,把每个值和对应的列名映射成键值对对象,最后整理成目标格式的JSON。
步骤分解:
- 解析原始JSON:用C#常用的Json.NET(Newtonsoft.Json)库把输入的JSON字符串反序列化为可操作的对象。
- 提取列名列表:从第一个
myRow值里按|分割得到所有列名。 - 遍历生成键值对:对每一行后续的
myRow,同样按|分割得到值数组,再和列名一一对应构建键值对字典。 - 序列化回目标JSON:把生成的键值对数组转成你需要的JSON格式。
完整代码实现:
首先确保你安装了Json.NET NuGet包:
Install-Package Newtonsoft.Json
然后是具体代码:
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { // 替换成你的原始JSON字符串 string originalJson = @" { ""DynamicColumnsList"": [ { ""myRow"":""Title|KeyQuestion|OfferingBanner|OfferingOverview|Image_x0020_Icon|KeyContacts|KeyContacts_x003a_ID|KeyInvestmentAreas|KeyIssuesMarketDrivers|KeyServices|TypicalBuyers|AdditionalColumn1|Base64Image|Base64Banner|FSOCrossSector|ID"" }, { ""myRow"":""BigBetsTestTier1|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|SomeData|14"" }, { ""myRow"":""SecondTitle|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|OtherData|15"" } ] }"; // 反序列化为匿名类型,灵活处理动态结构 var originalData = JsonConvert.DeserializeAnonymousType(originalJson, new { DynamicColumnsList = new List<Dictionary<string, string>>() }); // 提取第一行的列名 var columnNames = originalData.DynamicColumnsList[0]["myRow"].Split('|'); // 处理后续数据行 var resultRows = new List<Dictionary<string, string>>(); foreach (var row in originalData.DynamicColumnsList.Skip(1)) { var values = row["myRow"].Split('|'); // 用Zip方法把列名和值一一配对生成字典 var keyValueRow = columnNames.Zip(values, (col, val) => new { Col = col, Val = val }) .ToDictionary(kv => kv.Col, kv => kv.Val); resultRows.Add(keyValueRow); } // 构建最终的JSON结构 var result = new { DynamicColumnsList = resultRows }; // 输出格式化后的目标JSON string targetJson = JsonConvert.SerializeObject(result, Formatting.Indented); Console.WriteLine(targetJson); } }
代码说明:
- 匿名类型反序列化:不用提前定义实体类,快速适配这种动态列名的场景。
- Zip方法:高效将列名数组和值数组按位置配对,一行代码生成键值对字典。
- Skip(1):跳过第一行列名行,只处理实际数据行。
- 格式化输出:用
Formatting.Indented生成和你示例一致的可读性强的JSON。
运行后你会得到完全符合需求的输出格式,哪怕数据超过10行也能轻松处理,性能完全够用。
内容的提问来源于stack exchange,提问作者Gourav
相关产品推荐
相关产品推荐

