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

如何为单个控制器Action方法生成PascalCase格式的JSON输出

单个ASP.NET Web API控制器Action返回帕斯卡命名(PascalCase)JSON的解决方案

需求说明

需要让指定的控制器Action返回**帕斯卡命名(PascalCase)**格式的JSON,且不修改全局序列化配置。目标输出示例如下:

{
    "AuthenticationResult": {
        "AccessToken": "",
        "ExpiresIn": 0,
        "TokenType": "",
        "RefreshToken": "",
        "IdToken": ""
    }
}

现有DTO类(仅在此Action中使用)和控制器方法代码如下:

原DTO类

public class AuthResponse
{
    public AuthenticationResult authenticationResult { get; set; }
}

public class AuthenticationResult
{
    [JsonProperty("AccessToken")]
    public string AccessToken { get; set; }
    public int ExpiresIn { get; set; }
    public string TokenType { get; set; }
    public string RefreshToken { get; set; }
    public string IdToken { get; set; }
}

原控制器方法

public async Task<IHttpActionResult> GetAuthenticationToken(string Guid = null)
{
    try
    {
        var AuthResponse = await _Business.GetAuthenticationTokenAsync(Guid, null);

        return Ok(AuthResponse, this);
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);
    }
}

解决方案

方案一:修改DTO属性名+手动指定序列化策略(推荐)

由于DTO仅在此Action中使用,直接将属性名改为帕斯卡命名,再在Action中配置序列化规则:

1. 修改DTO类

public class AuthResponse
{
    public AuthenticationResult AuthenticationResult { get; set; }
}

public class AuthenticationResult
{
    public string AccessToken { get; set; }
    public int ExpiresIn { get; set; }
    public string TokenType { get; set; }
    public string RefreshToken { get; set; }
    public string IdToken { get; set; }
}

2. 修改控制器方法

手动配置帕斯卡命名的序列化设置,将对象序列化为JSON后返回:

public async Task<IHttpActionResult> GetAuthenticationToken(string Guid = null)
{
    try
    {
        var authResponse = await _Business.GetAuthenticationTokenAsync(Guid, null);
        
        // 配置帕斯卡命名序列化规则
        var serializerSettings = new JsonSerializerSettings
        {
            ContractResolver = new DefaultContractResolver
            {
                NamingStrategy = new PascalCaseNamingStrategy()
            }
        };
        var jsonString = JsonConvert.SerializeObject(authResponse, serializerSettings);
        
        return Content(HttpStatusCode.OK, jsonString, "application/json");
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);
    }
}

方案二:使用自定义ActionFilter(适用于多Action场景)

如果后续有多个Action需要相同的帕斯卡命名规则,可创建自定义ActionFilter,仅对目标Action生效:

1. 创建ActionFilter特性

public class PascalCaseJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response != null && actionExecutedContext.Response.Content is ObjectContent objectContent)
        {
            var serializerSettings = new JsonSerializerSettings
            {
                ContractResolver = new DefaultContractResolver
                {
                    NamingStrategy = new PascalCaseNamingStrategy()
                }
            };
            var jsonFormatter = new JsonMediaTypeFormatter
            {
                SerializerSettings = serializerSettings
            };
            // 替换响应内容的格式化器
            actionExecutedContext.Response.Content = new ObjectContent(
                objectContent.ObjectType, 
                objectContent.Value, 
                jsonFormatter
            );
        }
        base.OnActionExecuted(actionExecutedContext);
    }
}

2. 在Action上添加特性

[PascalCaseJson]
public async Task<IHttpActionResult> GetAuthenticationToken(string Guid = null)
{
    try
    {
        var authResponse = await _Business.GetAuthenticationTokenAsync(Guid, null);
        return Ok(authResponse);
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);
    }
}

方案三:保留原DTO,通过JsonProperty指定输出名称

如果不想修改DTO属性名,直接给所有需要帕斯卡输出的属性添加[JsonProperty]特性,指定输出的键名:

修改后的DTO类

public class AuthResponse
{
    [JsonProperty("AuthenticationResult")]
    public AuthenticationResult authenticationResult { get; set; }
}

public class AuthenticationResult
{
    [JsonProperty("AccessToken")]
    public string AccessToken { get; set; }
    [JsonProperty("ExpiresIn")]
    public int ExpiresIn { get; set; }
    [JsonProperty("TokenType")]
    public string TokenType { get; set; }
    [JsonProperty("RefreshToken")]
    public string RefreshToken { get; set; }
    [JsonProperty("IdToken")]
    public string IdToken { get; set; }
}

这种情况下控制器方法无需修改,直接返回Ok(authResponse)即可,序列化时会按照JsonProperty指定的名称输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:29:58