ASP.NET Core Web API下划线属性名序列化异常问题及修复
问题产生原因
ASP.NET Core 3.0及以上版本默认使用System.Text.Json作为内置JSON序列化器,全局默认配置的属性命名策略为JsonNamingPolicy.CamelCase(小驼峰命名规则)。
在.NET 6之前的版本中,该内置小驼峰命名策略存在实现缺陷:当属性名包含下划线_时,转换逻辑会将第一个下划线识别为强制单词边界,错误地将第一个下划线前的字符段中,除紧邻下划线的最后一个字符外的所有前置字符全部转为小写,下划线及后续所有字符不做任何大小写转换。
该缺陷的表现和测试用例完全匹配:
AAAA_BBBB:第一个下划线前共4个A,最后1个A保留大写,前3个A转小写,得到aaaA_BBBBAAAAAAAA_BBB_CCC_DDD:第一个下划线前共8个A,最后1个A保留大写,前7个A转小写,得到aaaaaaaA_BBB_CCC_DDDA_BBB:第一个下划线前共1个A,没有前置字符,直接转小写得到a_BBBAA_BB:第一个下划线前共2个A,最后1个A保留大写,前1个A转小写,得到aA_BB
修复方案
根据实际需求选择对应方案即可:
- 方案1:不需要全局小驼峰命名时,直接关闭默认命名转换策略
在服务配置阶段将JSON序列化选项的PropertyNamingPolicy设为null,序列化后的属性名会和C#代码中定义的名称完全一致。
.NET 6+ 顶层语句配置代码:
.NET Core 3.1/.NET 5 Startup.cs配置代码:builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; });public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; }); } - 方案2:需要保留全局小驼峰命名时
可选两种处理方式:- 将项目升级到.NET 6及以上版本,新版本的
System.Text.Json已经修复了该命名策略转换缺陷,转换逻辑符合标准小驼峰预期。 - 无法升级框架版本时,可切换序列化器为Newtonsoft.Json(Json.NET),该库的小驼峰转换逻辑不存在该缺陷。操作步骤为:先安装对应版本的
Microsoft.AspNetCore.Mvc.NewtonsoftJsonNuGet包,再修改服务配置:// .NET 6+ 示例 builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); });
- 将项目升级到.NET 6及以上版本,新版本的
- 方案3:仅需调整个别属性的序列化名称时
不需要修改全局配置,直接给对应属性添加[JsonPropertyName]特性,显式指定序列化后的属性名即可:public class TestClass { [JsonPropertyName("aaaaBBBB")] // 替换为实际需要的序列化名称 public string AAAA_BBBB { get; set; } = "1"; }
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

