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

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 → ReBroadcastTimestamp
  • corporate_actions → CorporateActions
  • action_type → ActionType
  • userId → UserId(通过大小写不敏感匹配)

特殊情况处理

如果个别属性需要特殊映射规则,仍可单独添加JsonPropertyName属性,它会优先于自定义命名策略生效:

[JsonPropertyName("custom_snake_property")]
public string SpecialProperty { get; set; }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:19:53