You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:46:06