如何强制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
相关产品推荐
相关产品推荐

