返回DataTable作为响应时列名格式异常问题求助
问题:DataTable返回时列名格式异常(带下划线列显示异常,无下划线列转小写)
我在通过ASP.NET Web API返回DataTable时遇到了一个奇怪的问题:当列名包含下划线(比如COLUMN_ONE)时,返回结果的格式异常;而没有下划线的列名则会被自动转为小写。相关代码如下,恳请大家帮忙分析解决:
[HttpGet] public System.Data.DataTable GetDummyTable() { System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Add("COLUMN_ONE"); dt.Columns.Add("COLUMN_TWO"); for (int i = 0; i < 100; i++) { System.Data.DataRow row = dt.NewRow(); row["COLUMN_ONE"] = i; row["COLUMN_TWO"] = "X" + i; dt.Rows.Add(row); } return dt; }

解决方案分析与修复
这个问题根源在于ASP.NET默认JSON序列化器的自动命名转换行为——不管是Newtonsoft.Json还是System.Text.Json,默认都会把属性/键名转为驼峰格式,但DataTable的列名在序列化时的处理逻辑比较特殊,带下划线的列名容易触发异常转换。给你几个实用的解决办法:
方法1:修改全局序列化配置(推荐,一劳永逸)
如果希望所有接口都保留原始列名格式,不需要自动转驼峰,可以根据你使用的序列化器修改全局配置:
若使用Newtonsoft.Json(旧版ASP.NET或手动配置)
在Startup.cs的ConfigureServices方法里添加:
services.AddControllers() .AddNewtonsoftJson(options => { // 禁用自动驼峰转换,保留原始列名 options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });
若使用System.Text.Json(.NET Core 3.0+默认)
在Program.cs中配置:
builder.Services.AddControllers() .AddJsonOptions(options => { // 取消默认的命名策略,保留原始列名 options.JsonSerializerOptions.PropertyNamingPolicy = null; });
方法2:针对单个接口手动处理序列化
如果不想改动全局配置,只需要这个接口返回原始列名,可以手动把DataTable序列化为JSON字符串再返回:
[HttpGet] public IActionResult GetDummyTable() { DataTable dt = new DataTable(); dt.Columns.Add("COLUMN_ONE"); dt.Columns.Add("COLUMN_TWO"); for (int i = 0; i < 100; i++) { DataRow row = dt.NewRow(); row["COLUMN_ONE"] = i; row["COLUMN_TWO"] = "X" + i; dt.Rows.Add(row); } // 手动序列化,强制保留原始列名 string json = JsonConvert.SerializeObject(dt, new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() }); return Content(json, "application/json"); }
问题背后的原因
默认情况下,JSON序列化器会把.NET的标识符转为驼峰式命名(比如COLUMN_TWO变成columnTwo),但DataTable的行数据会被当作字典来处理。有些序列化器在处理带下划线的键时,可能错误地把下划线当作分隔符做驼峰转换,导致格式混乱;而纯大写无下划线的列名则会被直接转成小写驼峰,这就出现了你看到的两种异常情况。
内容的提问来源于stack exchange,提问作者vishnurao
相关产品推荐
相关产品推荐

