使用网络 API 自定义属性更改 JSON 对 Pascal 大小写的响应

Change JSON response to Pascal case using web API custom attribute

我将 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"}]

大功告成:您需要重写 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)
        );
    }
}