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

如何配置ASP.NET,使部分响应为驼峰式、部分为帕斯卡式序列化?

根据请求头动态切换JSON序列化命名策略(帕斯卡/驼峰)

可以通过自定义动作过滤器实现,根据请求头标识动态给不同客户端返回对应格式的JSON响应,具体步骤如下:

1. 创建自定义动作过滤器

创建一个动作过滤器类,读取请求头判断客户端类型,然后动态设置JSON序列化的命名策略:

public class JsonNamingPolicyFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 前置逻辑无需额外处理可留空
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (context.Result is not ObjectResult objectResult) return;

        // 读取请求头中的客户端标识(可根据实际需求修改头名称)
        context.HttpContext.Request.Headers.TryGetValue("X-Client-Type", out var clientTypeValue);
        var isNewClient = clientTypeValue.FirstOrDefault()?.Equals("new", StringComparison.OrdinalIgnoreCase) ?? false;

        // 构建序列化选项
        var jsonOptions = new JsonSerializerOptions();
        if (isNewClient)
        {
            // newClient返回驼峰式
            jsonOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        }
        else
        {
            // OldClient返回帕斯卡式(保持对象原属性名)
            jsonOptions.PropertyNamingPolicy = null;
        }

        // 同步全局JSON配置(比如忽略空值、日期格式等,按需添加)
        var globalJsonOptions = context.HttpContext.RequestServices
            .GetRequiredService<IOptions<JsonOptions>>().Value.JsonSerializerOptions;
        jsonOptions.IgnoreNullValues = globalJsonOptions.IgnoreNullValues;
        jsonOptions.PropertyNameCaseInsensitive = globalJsonOptions.PropertyNameCaseInsensitive;
        // 其他全局配置可在此同步

        // 更新响应的序列化器
        objectResult.Value = JsonSerializer.SerializeToNode(objectResult.Value, jsonOptions);
        objectResult.Formatters.Clear();
        objectResult.Formatters.Add(new SystemTextJsonOutputFormatter(jsonOptions));
    }
}

2. 注册过滤器到全局配置

在Startup.cs(.NET 5及之前)或Program.cs(.NET 6+)中注册过滤器,同时保留全局默认的帕斯卡式配置:

.NET 5及之前(Startup.cs)

services.AddControllers(options =>
{
    // 全局添加过滤器
    options.Filters.Add<JsonNamingPolicyFilter>();
})
.AddJsonOptions(jsonOptions =>
{
    // 默认帕斯卡式,兼容OldClient
    jsonOptions.JsonSerializerOptions.PropertyNamingPolicy = null;
    // 其他全局JSON配置,比如:
    // jsonOptions.JsonSerializerOptions.IgnoreNullValues = true;
});

.NET 6+(Program.cs)

builder.Services.AddControllers(options =>
{
    options.Filters.Add<JsonNamingPolicyFilter>();
})
.AddJsonOptions(jsonOptions =>
{
    jsonOptions.JsonSerializerOptions.PropertyNamingPolicy = null;
    // 其他全局JSON配置
});

3. 客户端请求要求

newClient在请求时,需要在请求头中添加标识,例如:

X-Client-Type: new

不带该头或标识不匹配的请求,会默认返回帕斯卡式JSON,兼容OldClient。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:50:35