ASP.NET Core Web API:混合命名JSON模型绑定问题及适配需求
解决ASP.NET Core Web API混合命名JSON的模型绑定问题
问题分析
默认的CamelCaseNamingPolicy仅负责将C#帕斯卡命名序列化为JSON驼峰,无法处理反序列化时蛇形命名(带下划线)到C#属性的自动映射,导致混合命名的JSON载荷无法正确绑定到模型。手动批量添加JsonPropertyName属性效率极低,因此需要自定义命名策略实现自动转换。
解决方案:自定义JSON命名策略
通过继承JsonNamingPolicy实现蛇形命名到帕斯卡命名的自动转换,配置后即可让反序列化过程自动处理混合命名的JSON属性。
1. 实现自定义命名策略类
创建一个处理蛇形转帕斯卡的命名策略:
public class SnakeCaseToPascalCaseNamingPolicy : JsonNamingPolicy { public override string ConvertName(string name) { if (string.IsNullOrWhiteSpace(name)) return name; // 分割下划线并将每个单词首字母大写后拼接 return string.Concat( name.Split('_', StringSplitOptions.RemoveEmptyEntries) .Select(part => char.ToUpperInvariant(part[0]) + part.Substring(1).ToLowerInvariant()) ); } }
2. 配置API的JSON序列化选项
根据你的.NET版本,在启动配置中替换默认的命名策略:
.NET 6+ (Program.cs)
builder.Services.AddControllers() .AddJsonOptions(options => { // 启用大小写不敏感匹配,兼容驼峰命名的JSON属性 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 反序列化时使用自定义策略处理蛇形命名 options.JsonSerializerOptions.PropertyNamingPolicy = new SnakeCaseToPascalCaseNamingPolicy(); // 序列化输出保持驼峰格式(按需配置) options.JsonSerializerOptions.WriteNamingPolicy = JsonNamingPolicy.CamelCase; });
.NET 5及以前 (Startup.cs)
public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.PropertyNamingPolicy = new SnakeCaseToPascalCaseNamingPolicy(); options.JsonSerializerOptions.WriteNamingPolicy = JsonNamingPolicy.CamelCase; }); }
3. 验证效果
假设传入的混合命名JSON:
{ "re_broadcast_timestamp": "2024-01-01T00:00:00", "corporate_actions": [{"action_type": "dividend"}], "userId": 123 }
对应的C#模型:
public class Transaction { public DateTime ReBroadcastTimestamp { get; set; } public List<CorporateAction> CorporateActions { get; set; } public int UserId { get; set; } } public class CorporateAction { public string ActionType { get; set; } }
配置后,API会自动完成以下映射:
re_broadcast_timestamp→ReBroadcastTimestampcorporate_actions→CorporateActionsaction_type→ActionTypeuserId→UserId(通过大小写不敏感匹配)
特殊情况处理
如果个别属性需要特殊映射规则,仍可单独添加JsonPropertyName属性,它会优先于自定义命名策略生效:
[JsonPropertyName("custom_snake_property")] public string SpecialProperty { get; set; }
内容的提问来源于stack exchange,提问作者shivu
相关产品推荐
相关产品推荐

