Есть ли способ выбрать между Newtonsoft.json и System.Text.Json в действиях?

#c# #asp.net-core #.net-5

#c# #asp.net-core #.net-5

Вопрос:

Я использую ASP.NET Core 5, я не хочу переходить с Newtonsoft.Json на System.Text.Json , но в некоторых случаях я хочу использовать System.Text.Json для повышения производительности в действиях контроллера.

Например, в ActionA я хочу использовать поведение Newtonsoft.Json сериализатора по умолчанию, а в ActionB я хочу изменить поведение на System.Text.Json сериализатор.

Комментарии:

1. Плохая идея. .NET core был оптимизирован для того, чтобы больше не использовать newtonsoft по соображениям производительности. Лучше сразу использовать новый способ работы.

Ответ №1:

Насколько я знаю, нет встроенного способа определения Jsonconvert для конкретного контроллера.

Если вы хотите изменить сгенерированный результат json jsonconvert, я предлагаю вам попробовать использовать этот способ.

Я предлагаю вам попробовать использовать actionfilter для достижения ваших требований.

Используя actionfilter, вы можете изменить форматировщик ввода, чтобы использовать другой jsonconvert для преобразования данных.

 public class CaseActionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext ctx)
    {
        if (ctx.Result is ObjectResult objectResult)
        {
            objectResult.Formatters.Add(new SystemTextJsonOutputFormatter(new JsonSerializerOptions
            {
                IgnoreNullValues = true
            }));
        }
    }
}
 

Использование:

     [HttpPost]
    [CaseAction]
    public ActionResult Index([FromForm]Member member) {
        if (ModelState.IsValid)
        {
            RedirectToAction("Index");
        }

        return Ok();
    }
 

Если вы хотите установить преобразование для связующего элемента модели, единственный способ — создать связующий элемент cusotmer modle и изменить средство форматирования json в соответствии с каждым типом модели. Нет способа достичь этого в соответствии с asp.net ядро модифицировало iresoucefilter, чтобы не поддерживать форматирование change is.

Комментарии:

1. Я считаю, что это пропускает обработку для случая, когда действие возвращает a JsonResult .