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
相关产品推荐
相关产品推荐

