.NET Core 3.1如何仅为单个控制器/方法返回PascalCase格式API响应
解决.NET Core 3.1单个API控制器/方法返回PascalCase JSON的方案
在.NET Core 3.1中,默认使用System.Text.Json序列化JSON,输出格式为camelCase。要仅让指定控制器/方法返回PascalCase格式且不影响全局,可采用以下几种可行方案:
方案一:在目标Action中手动序列化并返回ContentResult
直接在需要的Action内完成PascalCase格式的JSON序列化,无需修改全局配置,实现最简单:
using System.Text.Json; [HttpGet] public IActionResult GetObjList() { var response = new GenericModel<List<MyObject>> { Data = myobjectList }; // 配置序列化选项:保留属性原名称(PascalCase) var serializeOptions = new JsonSerializerOptions { PropertyNamingPolicy = null }; // 手动序列化为JSON字符串 var jsonString = JsonSerializer.Serialize(response, serializeOptions); // 返回ContentResult指定JSON格式 return Content(jsonString, "application/json"); }
方案二:自定义ActionFilterAttribute,按需应用
如果多个Action需要返回PascalCase格式,可创建自定义过滤器,仅在目标控制器/方法上标记使用:
1. 定义过滤器类
using System.Text.Json; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc; public class PascalCaseJsonFilter : IResultFilter { public void OnResultExecuting(ResultExecutingContext context) { if (context.Result is ObjectResult objectResult) { var serializeOptions = new JsonSerializerOptions { PropertyNamingPolicy = null }; var jsonString = JsonSerializer.Serialize(objectResult.Value, serializeOptions); // 替换原ObjectResult为ContentResult,输出PascalCase JSON context.Result = new ContentResult { Content = jsonString, ContentType = "application/json", StatusCode = objectResult.StatusCode }; } } public void OnResultExecuted(ResultExecutedContext context) { // 无需额外处理 } }
2. 在目标Action或控制器上应用过滤器
[HttpGet] [TypeFilter(typeof(PascalCaseJsonFilter))] public IActionResult GetObjList() { return Ok(new GenericModel<List<MyObject>> { Data = myobjectList }); }
说明
.NET Core 3.1的System.Text.Json中没有内置JsonNamingPolicy.PascalCase(该特性在.NET 5+引入),因此通过设置PropertyNamingPolicy = null来保留属性的原始PascalCase命名。- 全局
AddJsonOptions配置会影响所有API接口,因此不适合你的需求,上述局部方案可精准控制目标接口的输出格式。
内容的提问来源于stack exchange,提问作者SupunV
相关产品推荐
相关产品推荐

