Измените ответ JSON на регистр Pascal, используя пользовательский атрибут веб-API - PullRequest
1 голос
/ 06 октября 2019

Мой атрибут фильтра пользовательских действий для преобразования JSON-ответа ядра webApi MVC из camelCase в pascalCase не работает.

Попытка с использованием:

services.AddMvc()
    .AddJsonOptions(options => 
        options.SerializerSettings.ContractResolver = new DefaultContractResolver());

Однако этовид глобального параметра изменяет всю реакцию на случай Паскаля. Я хочу изменить только ограниченный ответ API на регистр Паскаля.

Пользовательский ActionFilterAttribute:

public class CancelCamelCaseResolverConfigurationAttribute : ActionFilterAttribute
{

    public override void OnResultExecuted(ResultExecutedContext context)
    {
        base.OnResultExecuted(context);

        var objectResult = context.Result as ObjectResult;
        if (objectResult != null)
        {
            objectResult.Formatters.Clear();
            objectResult.Formatters.Add(new JsonOutputFormatter(
                new JsonSerializerSettings()
                {
                    Formatting = Formatting.None,
                    ContractResolver = new DefaultContractResolver()
                }, ArrayPool<char>.Shared));
        }
    }
}

И использовать в контроллере webApi:

[CancelCamelCaseResolverConfiguration]
public class FrmMainSearchController : AtlasApiController<FrmMainSearchController>
{
    /*Api*/
}

Ожидаетсярезультат:

searchCriteria = [{Key: "xx", Value: "yy"}]

Фактический результат:

searchCriteria = [{key: "xx", value: "yy"}]

1 Ответ

1 голос
/ 07 октября 2019

Вы почти у цели: вам нужно переопределить метод OnActionExecuted() вместо OnResultExecuted().

Слишком поздно менять форматеры, когда вызывается метод фильтра OnResultExecuted().

Как исправить:

Переопределить метод OnResultExecuted, чтобы изменить форматер перед выполнением результата:

<strike>public override void OnResultExecuted(ResultExecutedContext context)</strike>
<b>public override void OnActionExecuted(ActionExecutedContext context)</b>
{
    ...
}

В качестве примечания,Вы не проверяли тип JsonResult. Чтобы он работал с Json() или JsonResult(), необходимо динамически проверять тип результата:

public class CancelCamelCaseResolverConfigurationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        base.OnActionExecuted(context);
        switch(context.Result){
            case JsonResult j:
                var result = new ObjectResult(j.Value);
                context.Result = result;
                ChangeFormatting(result);
                break;
            case ObjectResult o:
                ChangeFormatting(o);
                break;
            default:
                return;
        }

    }

    private void ChangeFormatting(ObjectResult result){
        if (result == null){ return; }
        result.Formatters.Clear();
        result.Formatters.Add(new JsonOutputFormatter(
            new JsonSerializerSettings()
            {
                Formatting = Formatting.None,
                ContractResolver = new DefaultContractResolver()
            }, ArrayPool<char>.Shared)
        );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...