使用Web API自定义属性将JSON响应更改为Pascal大小写 [英] Change JSON response to Pascal case using web API custom attribute

查看:55
本文介绍了使用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大小写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆