Измените параметры сериализации JSON одного контроллера ASP.NET Core. - PullRequest
0 голосов
/ 02 октября 2018

У меня есть два контроллера контроллера: ControllerA и ControllerB.Базовый класс каждого контроллера: Controller.

. ControllerA должен возвращать JSON в формате по умолчанию (camelCase).ControllerB должен возвращать данные в другом формате JSON: snake_case.

Как я могу реализовать это в ASP.NET Core 2.1?

Я пробовал startup с:

services
    .AddMvc()
    .AddJsonOptions(options =>
    {
        options.SerializerSettings.Converters.Add(new StringEnumConverter());
        options.SerializerSettings.ContractResolver = new DefaultContractResolver()
        {
            NamingStrategy = new SnakeCaseNamingStrategy()
        };
    })
    .AddControllersAsServices();

Но это изменит сериализацию для все контроллеры, не только для ControllerB.Как я могу настроить или аннотировать эту функцию для 1 контроллера?

1 Ответ

0 голосов
/ 03 октября 2018

Этого можно добиться с помощью комбинации Фильтр действий и Форматировщик вывода .Вот пример того, как может выглядеть фильтр действий:

public class SnakeCaseAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext ctx)
    {
        if (ctx.Result is ObjectResult objectResult)
        {
            objectResult.Formatters.Add(new JsonOutputFormatter(
                new JsonSerializerSettings
                {
                    ContractResolver = new DefaultContractResolver
                    {
                        NamingStrategy = new SnakeCaseNamingStrategy()
                    }
                },
                ctx.HttpContext.RequestServices.GetRequiredService<ArrayPool<char>>()));
        }
    }
}

Используя OnActionExecuted, код запускается после соответствующего действия и сначала проверяет, является ли результат ObjectResult (который также применяетсядо OkObjectResult благодаря наследованию).Если это ObjectResult, фильтр просто добавляет настроенную версию JsonOutputFormatter, которая будет сериализовать свойства, используя SnakeCaseNamingStrategy.Второй параметр в конструкторе JsonOutputFormatter извлекается из контейнера DI.

Чтобы использовать этот фильтр, просто примените его к соответствующему контроллеру:

[SnakeCase]
public class ControllerB : Controller { }

Примечание: Возможно, вы захотите создать JsonOutputFormatter где-нибудь раньше, например - я не зашел так далеко в этом примере, поскольку это вторично по отношению к рассматриваемому вопросу.

...