C# Asp WebApi:美化ActionResult JSON输出

C# Asp WebApi:美化ActionResult JSON输出,c#,json,rest,asp.net-web-api,asp.net-core,C#,Json,Rest,Asp.net Web Api,Asp.net Core,我正在开发基于ASP.NET核心Web API的REST服务,希望在我的端点中添加一个参数'prettify',以便响应json将使用缩进进行格式化,并在Web浏览器中可读 我的问题-如何更改ASP.WEB API核心应用程序中每个控制器方法的JSON格式 感谢您的帮助。创建一个操作筛选器,可用于您希望添加该功能的任何操作。我在Asp.NETWebAPI2(非核心)中也实现了同样的效果,使用了DelegatingHandler,它将检查请求并根据URL中的prettify=true查询参数更新j

我正在开发基于ASP.NET核心Web API的REST服务,希望在我的端点中添加一个参数'prettify',以便响应json将使用缩进进行格式化,并在Web浏览器中可读

我的问题-如何更改ASP.WEB API核心应用程序中每个控制器方法的JSON格式


感谢您的帮助。

创建一个操作筛选器,可用于您希望添加该功能的任何操作。我在Asp.NETWebAPI2(非核心)中也实现了同样的效果,使用了
DelegatingHandler
,它将检查请求并根据URL中的
prettify=true
查询参数更新json格式化程序的缩进

下面是如何使用委托处理程序完成的

/// <summary>
/// Custom handler to allow pretty print json results.
/// </summary>
public class PrettyPrintJsonHandler : DelegatingHandler {
    const string prettyPrintConstant = "pretty";
    MediaTypeHeaderValue contentType = MediaTypeHeaderValue.Parse("application/json;charset=utf-8");
    private System.Web.Http.HttpConfiguration httpConfig;
    /// <summary>
    /// Initializes a new instance of the <seealso cref="PrettyPrintJsonHandler"/> class with an HTTP Configuration.
    /// </summary>
    /// <param name="config"></param>
    public PrettyPrintJsonHandler(System.Web.Http.HttpConfiguration config) {
        this.httpConfig = config;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) {
        var canPrettyPrint = checkQuery(request.RequestUri.Query);
        var jsonFormatter = httpConfig.Formatters.JsonFormatter;
        jsonFormatter.Indent = canPrettyPrint;

        var response = await base.SendAsync(request, cancellationToken);

        if (canPrettyPrint && response.Content != null) {
            response.Content.Headers.ContentType = contentType;
        }

        return response;
    }

    private bool checkQuery(string queryString) {
        var canPrettyPrint = false;
        if (!string.IsNullOrWhiteSpace(queryString)) {
            var prettyPrint = QueryString.Parse(queryString)[prettyPrintConstant];
            canPrettyPrint = !string.IsNullOrWhiteSpace(prettyPrint) && Boolean.TryParse(prettyPrint, out canPrettyPrint) && canPrettyPrint;
        }
        return canPrettyPrint;
    }
}
//
///自定义处理程序,允许漂亮的打印json结果。
/// 
公共类PrettyPrintJsonHandler:DelegatingHandler{
常量字符串prettyPrintConstant=“pretty”;
MediaTypeHeaderValue contentType=MediaTypeHeaderValue.Parse(“应用程序/json;字符集=utf-8”);
private System.Web.Http.HttpConfiguration httpConfig;
/// 
///使用HTTP配置初始化类的新实例。
/// 
/// 
公共PrettyPrintJsonHandler(System.Web.Http.HttpConfiguration配置){
this.httpConfig=config;
}
受保护的重写异步任务SendAsync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken){
var canPrettyPrint=checkQuery(request.RequestUri.Query);
var jsonFormatter=httpConfig.Formatters.jsonFormatter;
jsonFormatter.Indent=canPrettyPrint;
var response=await base.sendaync(请求、取消令牌);
if(canPrettyPrint&&response.Content!=null){
response.Content.Headers.ContentType=ContentType;
}
返回响应;
}
私有布尔检查查询(字符串查询字符串){
var canPrettyPrint=false;
如果(!string.IsNullOrWhiteSpace(queryString)){
var prettyPrint=QueryString.Parse(QueryString)[prettyPrintConstant];
canPrettyPrint=!string.IsNullOrWhiteSpace(prettyPrint)&&Boolean.TryParse(prettyPrint,out-canPrettyPrint)&&canPrettyPrint;
}
返回预打印;
}
}
在安装过程中作为全局消息处理程序添加的


同样的概念也可以应用于动作过滤器。

感谢@Nkosi评论,我找到了解决方案。下面是动作过滤器的代码,它查找'prettify'参数并向输出JSON添加缩进。如果省略该参数,还将添加缩进

public class OutputFormatActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        var actionResult = context.Result as ObjectResult;
        if (actionResult == null) return;

        var paramObj = context.HttpContext.Request.Query["prettify"];
        var isPrettify = string.IsNullOrEmpty(paramObj) || bool.Parse(paramObj);

        if (!isPrettify) return;

        var settings = new JsonSerializerSettings { Formatting = Formatting.Indented };

        actionResult.Formatters.Add(new JsonOutputFormatter(settings, ArrayPool<char>.Shared));
    }
}
公共类OutputFormatActionFilter:IActionFilter
{
ActionExecuting(ActionExecutingContext上下文)上的公共void
{
}
public void OnActionExecuted(ActionExecutedContext上下文)
{
var actionResult=context.Result作为ObjectResult;
if(actionResult==null)返回;
var paramObj=context.HttpContext.Request.Query[“prettify”];
var isPrettify=string.IsNullOrEmpty(paramObj)| | bool.Parse(paramObj);
如果(!isPrettify)返回;
var settings=newjsonserializersettings{Formatting=Formatting.Indented};
添加(新的JsonOutputFormatter(设置,ArrayPool.Shared));
}
}

创建一个操作过滤器,可用于您想要添加该功能的任何操作。我使用委托处理程序在WebAPI(而不是core)中实现了同样的功能。这将检查请求并根据URL中的prettify=true查询参数更新json格式化程序缩进谢谢您的评论,这很有帮助!