如何配置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
相关产品推荐
相关产品推荐

