如何让ASP.NET Core 8 MVC控制器返回JSON保留属性原大小写
解决ASP.NET Core 8中Newtonsoft.Json序列化保留原属性名的问题
核心原因
你的问题出在ASP.NET Core 8默认采用System.Text.Json作为序列化器,或是即便配置了Newtonsoft.Json,默认命名策略被设为驼峰命名(CamelCase),导致属性名被转为小写开头。你之前的手动序列化尝试无效,是因为Ok()方法或JsonResult默认使用全局配置的序列化器,而非你手动创建的自定义设置。
解决方案
1. 全局配置Newtonsoft.Json并保留原属性名
先确保项目已安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包,接着在Program.cs中全局配置Newtonsoft的序列化规则:
var builder = WebApplication.CreateBuilder(args); // 添加控制器并配置NewtonsoftJson builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 使用DefaultNamingStrategy保持属性与C#类声明一致 options.SerializerSettings.ContractResolver = new DefaultContractResolver { NamingStrategy = new DefaultNamingStrategy { OverrideSpecifiedNames = false } }; // 可选:开启格式化输出 options.SerializerSettings.Formatting = Formatting.Indented; }); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
配置完成后,直接使用return Ok(foo);即可返回符合预期的JSON:
{ "Id": "0", "Name": "Foo" }
2. 局部Action级别配置(无需全局修改)
若不想全局更改序列化策略,可在单个Action中手动序列化并返回ContentResult,确保使用自定义序列化设置:
[Route("/api/v1/search-approval-workflows")] [ValidateModelState] [SwaggerOperation("SearchApprovalWorkflowsGet")] public virtual IActionResult SearchApprovalWorkflowsGet([FromQuery] string s) { var foo = new Foo { Id = "0", Name = "Foo" }; var resolver = new DefaultContractResolver { NamingStrategy = new DefaultNamingStrategy { OverrideSpecifiedNames = false } }; string json = JsonConvert.SerializeObject(foo, new JsonSerializerSettings { ContractResolver = resolver, Formatting = Formatting.Indented }); // 指定Content-Type为application/json,确保正确识别为JSON返回 return Content(json, "application/json"); }
3. 修复你之前的JsonResult尝试
如果想用JsonResult,需手动传入Newtonsoft的序列化设置——默认JsonResult会使用System.Text.Json的规则,和你针对Newtonsoft的设置不兼容:
var foo = new Foo { Id = "0", Name = "Foo" }; var resolver = new DefaultContractResolver { NamingStrategy = new DefaultNamingStrategy { OverrideSpecifiedNames = false } }; var settings = new JsonSerializerSettings { ContractResolver = resolver, Formatting = Formatting.Indented }; // 使用Newtonsoft专属的JsonResult(注意命名空间:Microsoft.AspNetCore.Mvc.NewtonsoftJson) return new NewtonsoftJsonResult(foo, settings);
为何之前的尝试无效?
- 直接返回序列化后的字符串时,ASP.NET Core会将其识别为普通文本而非JSON,需手动指定
Content-Type; - 默认
JsonResult未配置Newtonsoft时,会使用System.Text.Json的驼峰命名规则,和你的Newtonsoft设置不匹配; Ok()方法依赖全局配置的序列化器,若未全局启用Newtonsoft,会默认使用System.Text.Json。
内容的提问来源于stack exchange,提问作者C D
相关产品推荐
相关产品推荐

