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

如何强制ASP.NET Core MVC将dynamic/ExpandoObject返回值转为驼峰命名?

解决ASP.NET Core MVC中动态对象的JSON驼峰命名问题

我之前也碰到过一模一样的问题——用强类型对象返回JSON时,ASP.NET Core MVC会自动把属性转成驼峰命名,但一用dynamic或者ExpandoObject就失效,属性名还是原封不动输出。其实只要在MVC的JSON序列化配置里加个小设置,就能让所有内容(包括动态对象)都强制应用驼峰命名。

核心解决方案:配置JSON序列化选项

不管你用的是.NET 6+的顶级语句(Program.cs)还是传统的Startup.cs,只需要在配置控制器服务的时候,指定JSON序列化的命名规则,同时别忘了处理字典类型的键(因为ExpandoObject本质上就是个IDictionary<string, object>,默认不会自动转驼峰)。

.NET 6+ Program.cs 写法

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 对强类型属性应用驼峰命名
        options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        // 关键配置:让字典(包括ExpandoObject)的键也转成驼峰
        options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    });

传统 Startup.cs 写法(.NET 5及更早版本)

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
            options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
        });
}

验证效果

比如你创建一个动态对象测试:

dynamic dynamicObj = new ExpandoObject();
dynamicObj.UserName = "JohnDoe";
dynamicObj.EmailAddress = "john@example.com";
dynamicObj.MemberLevel = "Premium";

return Ok(dynamicObj);

配置完成后,返回的JSON就会自动变成驼峰格式:

{
  "userName": "JohnDoe",
  "emailAddress": "john@example.com",
  "memberLevel": "Premium"
}

补充说明

  • 匿名对象其实默认就会被ASP.NET Core MVC转成驼峰,不需要额外配置,这个问题主要针对ExpandoObject和其他基于字典的动态类型。
  • 如果你用的是Newtonsoft.Json(而非系统默认的System.Text.Json),配置逻辑类似:改用AddNewtonsoftJson,设置ContractResolver为CamelCasePropertyNamesContractResolver即可,它会自动处理字典键的命名转换。

内容的提问来源于stack exchange,提问作者mohammad rostami siahgeli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:35:51