如何为单个控制器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
相关产品推荐
相关产品推荐

