AspNet Core - настройки сериализации ввода / вывода JSON на уровне контроллера - PullRequest
3 голосов
/ 14 мая 2019

Моему приложению требуются (почти по умолчанию) параметры сериализации JSON:

services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddJsonOptions(options =>
            {
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                options.SerializerSettings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
                options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
            });

Только для одного контроллера мне нужно использовать разные стратегии именования для обоих входов (где я использую привязку модели с [FromBody] myComplexObjectи вывод с

options.SerializerSettings.ContractResolver = new DefaultContractResolver();

Мой вопрос практически идентичен Web API: настройка параметров сериализатора JSON на уровне действия или на контроллере за исключением того, что я запрашиваю AspNet Core 2.2+,в котором IControllerConfiguration больше не существует.

На вопрос, эквивалентный Core 2.1+, есть ответ: Настройка средств форматирования ввода / вывода на контроллерах с ASP.NET Core 2.1

Ответы там кажутся слегка фрагментированными или неполными - трудно представить, что нет более простого способа добиться этого. У кого-нибудь есть идея, как использовать DefaultContractResolver для всех входных и выходных данных в одном контроллере?

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Ответ, который вы связываете, работает достаточно хорошо, но вы можете расширить его, обернув его в атрибут, который вы можете применить к любому действию или контроллеру.Например:

public class JsonConfigFilterAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext context)
    {
        if (context.Result is ObjectResult objectResult)
        {
            var serializerSettings = new JsonSerializerSettings
            {
                ContractResolver = new DefaultContractResolver()
            };

            var jsonFormatter = new JsonOutputFormatter(
                serializerSettings, 
                ArrayPool<char>.Shared);

            objectResult.Formatters.Add(jsonFormatter);
        }

        base.OnResultExecuting(context);
    }
}

И просто добавьте его в методы действий или контроллеры:

[JsonConfigFilter]
public ActionResult<Foo> SomeAction()
{
    return new Foo
    {
        Bar = "hello"
    };
}
0 голосов
/ 14 мая 2019

Для глобальных настроек в Startup.cs, установив Newtonsoft.json, у вас будет это

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

Для отдельного контроллера вы можете переопределить глобальную настройку ниже

 public JsonResult GetStates()
    {
        var model = new List<StateObject>();
        if (!string.IsNullOrEmpty(id))
        {
            var schedule = _settingsService.GetStates().ToList();
            return Json(new SelectList(schedule, "StateCode", "Name"), new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() });
        }
        else
            return Json(new SelectList(model, "StateCode", "Name"), new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() });
    }

Дайте мне знать, если это решит вашу проблему, или вам нужна дополнительная помощь.

...