Web API:在操作或控制器级别配置JSON序列化程序设置

Joh*_*han 29 c# json.net asp.net-web-api

许多SO线程都涵盖了在应用程序级别覆盖Web API的默认JSON序列化程序设置.但是如何在动作级别配置其设置?例如,我可能想要在我的一个操作中使用camelcase属性进行序列化,但不能在其他操作中进行序列化.

Fed*_*uma 48

选项1(最快)

在操作级别,您可以JsonSerializerSettings在使用Json方法时始终使用自定义实例:

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        var model = new MyModel();
        return Json(model, settings);
    }
}
Run Code Online (Sandbox Code Playgroud)

选项2(控制器级别)

您可以创建一个IControllerConfiguration自定义JsonFormatter 的新属性:

public class CustomJsonAttribute : Attribute, IControllerConfiguration 
{
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
    {
        var formatter = controllerSettings.Formatters.JsonFormatter;

        controllerSettings.Formatters.Remove(formatter);

        formatter = new JsonMediaTypeFormatter
        {
            SerializerSettings =
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            }
        };

        controllerSettings.Formatters.Insert(0, formatter);
    }
}

[CustomJson]
public class MyController : ApiController
{
    public IHttpActionResult Get()
    {
        var model = new MyModel();
        return Ok(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @JobaDiniz正如您所说,如果更改原始格式化程序的属性,这些更改将影响所有其他控制器 (2认同)

Dim*_*tri 13

这是上述操作属性的实现:

public class CustomActionJsonFormatAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext?.Response == null) return;

        var content = actionExecutedContext.Response.Content as ObjectContent;

        if (content?.Formatter is JsonMediaTypeFormatter)
        {
            var formatter = new JsonMediaTypeFormatter
            {
                SerializerSettings =
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                }
            };

            actionExecutedContext.Response.Content = new ObjectContent(content.ObjectType, content.Value, formatter);
        }
    }
}

public class MyController : ApiController
{
    [CustomActionJsonFormat]
    public IHttpActionResult Get()
    {
        var model = new MyModel();
        return Ok(model);
    }
}
Run Code Online (Sandbox Code Playgroud)