C#中API返回CSV字符串转JSON映射实体入库最优方案咨询
C#解析带特殊字符CSV格式接口返回方案
不要用普通string.Split()手写分割逻辑,你拿到的链式API返回本质是标准CSV格式数据,自己处理引号转义、字段内嵌逗号/特殊符号的边界情况极易出现字段错位,用成熟的专用解析组件是性价比最高的方案,不用反复给分割逻辑打补丁。
具体实现
C#生态里优先用CsvHelper做解析,它原生支持CSV标准的所有转义规则,还能直接把解析结果自动映射到自定义实体类,省掉手动逐字段赋值、类型转换的重复代码。
- 第一步:安装Nuget包,执行包管理命令
Install-Package CsvHelper即可 - 第二步:定义和CSV表头匹配的实体类,字段名和表头保持一致就能自动映射:
public class BizDataModel { public string YM { get; set; } public string BAN { get; set; } public string AME { get; set; } public string txtBAN { get; set; } public string txtNAME { get; set; } public string DESCRIPTION { get; set; } public int txtRANGE { get; set; } }
- 第三步:编写解析逻辑,先把原始返回里首尾多余的C#字符串包裹符清理掉,再交给解析器处理:
using CsvHelper; using System.Globalization; // 接口返回的原始字符串 string rawApiResult = @"YM,BAN,AME,txtBAN,txtNAME,DESCRIPTION,txtRANGE 2015-01,11111111,test1,11111111,test1,(15-1062TPX) 2.0mm JO-M1937 test 380g 54"",5 2015-01,22222222,test2,22222222,test2,bl 2.0mm JO-M1937 test 380g 54"",5 2015-01,33333333,test3,33333333,test3,(15-1062TPX) 2.0mm JO-M1937 test 380g 54"",5 2015-01,44444444,test4,44444444,test4,bl 2.0mm JO-M1937 test 380g 54"",5"; // 读取解析 using var reader = new StringReader(rawApiResult); using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); // 直接得到强类型实体列表,DESCRIPTION里的双引号、特殊符号会被自动正确处理 List<BizDataModel> dataList = csv.GetRecords<BizDataModel>().ToList(); // 转目标JSON直接序列化即可 string targetJson = System.Text.Json.JsonSerializer.Serialize(dataList); // 拿到的dataList可以直接作为EF Core等ORM的入参写入数据库
手写Split的问题
- 目前碰到的双引号、英寸符号只是特殊场景的一小部分,后续如果DESCRIPTION字段里出现逗号、换行符,手写分割逻辑需要不断加判断补漏洞,维护成本极高
- 成熟解析库已经过十几年的场景验证,覆盖了所有CSV格式的边界case,性能也远高于手写的循环分割逻辑
- 自动映射强类型的特性能省掉大量重复的类型转换、字段赋值代码,从解析到入库的链路可以少写很多冗余代码
注意:你贴的原始返回示例里每行DESCRIPTION结尾的单引号是C#字符串转义后的展示效果,实际接口返回的标准CSV格式里会用连续两个双引号做转义,上述代码已经适配了这个格式,如果实际接口返回有非标准格式瑕疵,只要在CsvHelper初始化时加对应的容错配置即可,不需要改动核心解析逻辑。
内容的提问来源于stack exchange,提问作者李光鴻
相关产品推荐
相关产品推荐

