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

ASP.NET Core中System.Text.Json不对动态对象属性驼峰化如何解决

System.Text.Json序列化ExpandoObject动态属性驼峰化方案

该现象是System.Text.Json的默认设计导致的:ExpandoObject 本质实现了 IDictionary<string, object> 接口,默认序列化逻辑中,PropertyNamingPolicy 仅作用于普通类/匿名类的属性命名转换,字典类型的键名不会应用该策略,所以动态属性会保持原始的帕斯卡命名。

方案1:全局配置(推荐)

直接在服务注册阶段修改JSON序列化配置,增加字典键的驼峰命名策略即可,配置后所有接口的字典、ExpandoObject都会自动应用驼峰转换:

// .NET 6及以上版本 Program.cs
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 原有类属性驼峰配置
        options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        // 新增字典键驼峰配置,覆盖ExpandoObject场景
        options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    });

方案2:局部接口单独配置

如果不想修改全局规则,仅需要特定接口生效,可以在Action返回时单独指定序列化配置:

[HttpGet]
public IActionResult Person()
{
    dynamic relatedItems = new ExpandoObject();
    relatedItems.LastName = "Last";
    var result = new 
    {
        FirstName = "First",
        RelatedItems = relatedItems
    };
    return new JsonResult(result, new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        DictionaryKeyPolicy = JsonNamingPolicy.CamelCase
    });
}

生效后返回结果

{
    "firstName": "First",
    "relatedItems": {
        "lastName": "Last"
    }
}

内容的提问来源于stack exchange,提问作者Hossein Fallah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:06:07