.NET 8升级后需将JSON属性首字母改为小写的原因咨询
问题:.NET 8升级后JSON属性首字母大小写变化导致前端取值失效
此前使用.NET 7.x(ASP.NET Core 7 MVC)与jQuery v1.10.2,通过Ajax从控制器获取数据的代码运行正常。但升级至.NET 8(ASP.NET Core MVC)并更新jQuery至v3.7.1后,原有代码失效,必须将前端取值的属性首字母改为小写(从var sentdata = msg.Name;改为var sentdata = msg.name;)才能正常运行。
前端请求代码
function SendRequestToGetData() { var xhr = $.ajax({ url: "/Line/GetData", type: 'POST', dataType: 'json', contentType: 'application/json; charset=utf-8', success: function (msg) { // 原代码:此处通过msg.Name获取属性 var sentdata = msg.Name; }, error: function (xhr) {} }); }
后端控制器代码
public class TestObject { public string Name { get; set; } } //------------------------------------------------ public class LineController : Controller { [HttpPost] public JsonResult GetData() { TestObject testbject = new TestObject { Name = "xxxxxxx" }; return Json(testbject); } }
解答
核心原因是ASP.NET Core 8 MVC 默认替换了JSON序列化器,且默认序列化行为发生改变:
- .NET 7及更早版本的ASP.NET Core MVC中,
JsonResult默认使用Newtonsoft.Json(Json.NET)作为序列化工具,该工具默认保留C#类属性的PascalCase命名规则(即C#中的Name序列化后依然是JSON中的"Name")。 - .NET 8开始,ASP.NET Core MVC默认改用
System.Text.Json作为序列化器,而System.Text.Json的默认配置会自动将C#的PascalCase属性转换为JavaScript生态常用的camelCase(即C#中的Name序列化后变为JSON中的"name")。
至于jQuery版本升级(从1.10.2到3.7.1),并非导致该问题的直接原因——新版本jQuery处理JSON响应时对属性大小写的敏感性和旧版本一致,只是后端返回的JSON字段名发生了变化,因此前端必须对应使用小写首字母才能正确取值。
恢复旧行为的可选方案
如果需要保持JSON输出为PascalCase,可在Program.cs中修改配置:
- 调整
System.Text.Json的序列化规则:
builder.Services.AddControllersWithViews() .AddJsonOptions(options => { // 禁用自动转换为camelCase,保留原属性命名 options.JsonSerializerOptions.PropertyNamingPolicy = null; });
- 或者重新启用Newtonsoft.Json作为序列化器:
// 先安装NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson builder.Services.AddControllersWithViews() .AddNewtonsoftJson();
内容的提问来源于stack exchange,提问作者Davood
相关产品推荐
相关产品推荐

