web-dev-qa-db-fra.com

API Web: configurer les paramètres du sérialiseur JSON au niveau de l'action ou du contrôleur

La redéfinition des paramètres par défaut du sérialiseur JSON pour l'API Web au niveau de l'application a été traitée dans de nombreux threads SO. Mais comment puis-je configurer ses paramètres au niveau de l'action? Par exemple, je peux vouloir sérialiser en utilisant des propriétés camelcase dans l'une de mes actions, mais pas dans les autres.

28
Johan

Option 1 (la plus rapide)

Au niveau de l'action, vous pouvez toujours utiliser une instance JsonSerializerSettings personnalisée tout en utilisant la méthode Json:

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

Option 2 (niveau contrôleur)

Vous pouvez créer un nouvel attribut IControllerConfiguration qui personnalise 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);
    }
}
46
Federico Dipuma

Voici une implémentation de ce qui précède en tant qu'attribut d'action:

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