Атрибут Только дата в. NET Core 3.1 - PullRequest
0 голосов
/ 05 марта 2020

Я мигрирую C# API с. NET Framework на. NET Core 3.1.

У меня есть требование, чтобы некоторые поля возвращали только yyyyMMdd (без времени) и другие поля это вернуло бы полное значение DateTime (дата и время).

В старом. NET мире фреймворков мы могли бы сделать быстрый конвертер, подобный этому:

public class OnlyDateConverter : IsoDateTimeConverter
{
    public OnlyDateConverter()
    {
        DateTimeFormat = "yyyyMMdd";
    }
}

и использовать его в моей модели, как

[JsonConverter(typeof(DateTimeConverter))]
public DateTime OrderDate { get; set; }

Это не работает в. NET Core 3.1.

Когда я вызываю его через Swagger, возвращается JSON:

"OrderDate": "2002-05-22T00:00:00"

Я знаю, что вы можете добавить JsonSerializerOption в Startup.cs, однако это заставит все даты использовать одинаковое форматирование. Мне нужно выбрать.

Я пробовал:

  • сделать несколько конвертеров json, однако их никогда не вызывают / работают
  • [DataType(DataType.Date)]
  • [JsonConverter(typeof(DateTimeConverter))]

Я потратил на это целый день. Я надеюсь, что кто-то сделал это и может указать на мою глупую ошибку.

1 Ответ

1 голос
/ 05 марта 2020

В октябре 2018 года было объявлено , что ASP. NET Core больше не будет использовать Newtonsoft. Json (более известный как Json. Net) и вместо этого будет используйте новую разработанную Microsoft базовую библиотеку под названием System.Text.Json. Это изменение было реализовано в начале 2019 года.

System.Text.Json имеет свой собственный набор атрибутов и функций , которые напрямую не совместимы с Json. Net (это считается критическое изменение ). Итак, другими словами, если вы используете в своем коде атрибуты Json. Net, такие как Newtonsoft.Json.JsonConverterAttribute, они будут проигнорированы System.Text.Json.

Если вы хотите продолжить использовать Json. Net с Asp. Net Core, вы определенно можете это сделать, но вам нужно будет установить пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet, а затем настроить свой проект для его использования. См. этот ответ до Откуда IMvcBuilder AddJsonOptions go in. Net Core 3.0? для получения дополнительной информации о том, как это сделать.

Другой вариант - мигрировать в новую библиотеку. Он имеет концепцию JsonConverter , но интерфейс отличается от Json. Net, поэтому вам придется соответствующим образом переписать свой код. Преобразователь, показанный в этот ответ в Форматирование DateTime в ASP. NET Core 3.0 с использованием System.Text. Json выглядит как хорошая отправная точка для того, что вы пытаетесь делать. Вы должны иметь возможность использовать System.Text.Json.Serialization.JsonConverterAttribute для применения конвертера к указанным c нужным датам, если вы не хотите применять его глобально через конфигурацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...