簡體   English   中英

Web API:在操作或控制器級別配置 JSON 序列化程序設置

[英]Web API: Configure JSON serializer settings on action or controller level

在應用程序級別覆蓋 Web API 的默認 JSON 序列化器設置已在許多 SO 線程中進行了介紹。 但是如何在操作級別配置其設置? 例如,我可能想在我的一個操作中使用駝峰屬性進行序列化,但不想在其他操作中進行序列化。

選項 1(最快)

在操作級別,您可以在使用Json方法時始終使用自定義JsonSerializerSettings實例:

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

選項 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);
    }
}

這是上述操作屬性的實現:

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);
    }
}

我需要在帶有錯誤詳細信息的 json 對象旁邊返回 404 狀態錯誤代碼。 我使用 WebApi.Content 和一個新的新 JsonMediaTypeFormatter 解決了它。

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {
        // Configure new Json formatter
        var formatter = new JsonMediaTypeFormatter
        {
            SerializerSettings =
            {
                TypeNameHandling = TypeNameHandling.None,
                PreserveReferencesHandling = PreserveReferencesHandling.None,
                Culture = CultureInfo.InvariantCulture,
                Formatting = Formatting.Indented,
                NullValueHandling = NullValueHandling.Ignore
            }
        };

        try
        {
            var model = new MyModel();
            return Content(HttpStatusCode.OK, model, formatter);
        }
        catch (Exception err)
        {
            var errorDto = GetErrorDto(HttpStatusCode.NotFound, $"{err.Message}");
            return Content(HttpStatusCode.NotFound, errorDto, formatter);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM