web-dev-qa-db-ja.com

Web API:アクションまたはコントローラーレベルでJSONシリアライザー設定を構成する

アプリケーションレベルでのWeb APIのデフォルトのJSONシリアライザー設定のオーバーライドは、多くのSOスレッドでカバーされています。しかし、アクションレベルでその設定を構成するにはどうすればよいですか?私のアクションの1つでキャメルケースプロパティを使用しますが、他のアクションでは使用しません。

28
Johan

オプション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);
    }
}

オプション2(コントローラーレベル)

JsonFormatterをカスタマイズする新しいIControllerConfiguration属性を作成できます。

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

次に、上記のアクション属性としての実装を示します。

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