本文介绍了使用Web API自定义属性将JSON响应更改为Pascal大小写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
将mvc核心webApi的json响应从"camelcase"转换为"pascalcase"的我的自定义操作过滤属性不起作用。
已尝试使用:
services.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.ContractResolver = new DefaultContractResolver());
但是,这种全局设置会更改对Pascal大小写的所有响应。我只想将有限的API响应更改为Pascal大小写。
自定义ActionFilterAttribute
:
public class CancelCamelCaseResolverConfigurationAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext context)
{
base.OnResultExecuted(context);
var objectResult = context.Result as ObjectResult;
if (objectResult != null)
{
objectResult.Formatters.Clear();
objectResult.Formatters.Add(new JsonOutputFormatter(
new JsonSerializerSettings()
{
Formatting = Formatting.None,
ContractResolver = new DefaultContractResolver()
}, ArrayPool<char>.Shared));
}
}
}
并在webApi控制器中使用:
[CancelCamelCaseResolverConfiguration]
public class FrmMainSearchController : AtlasApiController<FrmMainSearchController>
{
/*Api*/
}
预期结果:
searchCriteria = [{Key: "xx", Value: "yy"}]
实际结果:
searchCriteria = [{key: "xx", value: "yy"}]
推荐答案
差不多了:您需要覆盖OnActionExecuted()
方法,而不是OnResultExecuted()
。
调用OnResultExecuted()
过滤方法时更改格式化程序为时已晚。
修复方法:
重写OnResultExecuted
方法,以便在执行结果之前更改格式化程序:
public override void OnResultExecuted(ResultExecutedContext context)public override void OnActionExecuted(ActionExecutedContext context) { ... }
作为附注,您没有检查类型
JsonResult
。要使其与Json()
或JsonResult()
一起工作,您需要动态检查结果类型:
public class CancelCamelCaseResolverConfigurationAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
switch(context.Result){
case JsonResult j:
var result = new ObjectResult(j.Value);
context.Result = result;
ChangeFormatting(result);
break;
case ObjectResult o:
ChangeFormatting(o);
break;
default:
return;
}
}
private void ChangeFormatting(ObjectResult result){
if (result == null){ return; }
result.Formatters.Clear();
result.Formatters.Add(new JsonOutputFormatter(
new JsonSerializerSettings()
{
Formatting = Formatting.None,
ContractResolver = new DefaultContractResolver()
}, ArrayPool<char>.Shared)
);
}
}
这篇关于使用Web API自定义属性将JSON响应更改为Pascal大小写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!