【问题标题】:Change JSON response to Pascal case using web API custom attribute使用 Web API 自定义属性将 JSON 响应更改为 Pascal 案例
【发布时间】:2020-02-03 19:25:46
【问题描述】:

用于将 MVC 核心 webApi 的 JSON 响应从“camelCase”转换为“pascalCase”的自定义操作过滤器属性不起作用。

尝试使用:

services.AddMvc()
    .AddJsonOptions(options => 
        options.SerializerSettings.ContractResolver = new DefaultContractResolver());

但是,这种全局设置会改变所有对 Pascal 情况的响应。我只想更改对 Pascal 案例的有限 API 响应。

自定义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"}]

【问题讨论】:

    标签: c# asp.net-core-webapi actionfilterattribute


    【解决方案1】:

    您快到了:您需要覆盖 OnActionExecuted() 方法 而不是 OnResultExecuted()

    在调用OnResultExecuted() 过滤器方法时更改格式化程序为时已晚。

    如何解决:

    重写OnResultExecuted 方法,以便在结果执行之前更改格式化程序:

    public override void OnResultExecuted(ResultExecutedContext context) 公共覆盖无效 OnActionExecuted(ActionExecutedContext 上下文) { ... }

    附带说明,您没有检查类型 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)
            );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多