Указание пользовательского формата DateTime при сериализации с помощью Json.Net

Я разрабатываю API для публикации некоторых данных с помощью ASP.NET Web API.

В одном из API клиент хочет, чтобы мы отображали дату в формате yyyy-MM-dd . Я не хочу изменять глобальные настройки (например, GlobalConfiguration.Configuration.Formatters.JsonFormatter ) для этого, поскольку он очень специфичен для этого клиента. И я развиваю это в решении для нескольких клиентов.

Одним из решений, о котором я мог подумать, является создание пользовательского JsonConverter а затем JsonConverter его в свойство, которое мне нужно для создания пользовательского форматирования

например

 class ReturnObjectA { [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime ReturnDate { get;set;} } 

Просто интересно, есть ли другой простой способ сделать это.

Ты на правильном пути. Поскольку вы сказали, что не можете изменять глобальные настройки, то лучше всего применить атрибут JsonConverter по мере необходимости, как вы предложили. Оказывается, Json.Net уже имеет встроенный IsoDateTimeConverter который позволяет указать формат даты. К сожалению, вы не можете установить формат с помощью атрибута JsonConverter , поскольку единственным аргументом атрибута является тип. Однако существует простое решение: подclass IsoDateTimeConverter , затем укажите формат даты в конструкторе подclassа. Примените атрибут JsonConverter где необходимо, указав свой собственный конвертер, и вы готовы к работе. Вот полный код необходимого кода:

 class CustomDateTimeConverter : IsoDateTimeConverter { public CustomDateTimeConverter() { base.DateTimeFormat = "yyyy-MM-dd"; } } 

Если вы не возражаете, чтобы там было время, вам даже не нужно подclassифицировать IsoDateTimeConverter. Его формат даты по умолчанию – yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK (как видно из исходного кода ).

Это также можно сделать с помощью экземпляра temp IsoDateTimeConverter без изменения настроек глобального форматирования:

 string json = JsonConvert.SerializeObject(yourObject, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }); 

Это использует перегрузку, которая принимает params JsonConverter[] .

Вы можете использовать этот подход:

 public class DateFormatConverter : IsoDateTimeConverter { public DateFormatConverter(string format) { DateTimeFormat = format; } } 

И используйте его так:

 class ReturnObjectA { [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")] public DateTime ReturnDate { get;set;} } 

Строка DateTimeFormat использует синтаксис строки формата .NET, описанный здесь: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

Также можно использовать одну из настроек переустановки сериализатора:

 var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" }); 

Или

 var json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" }); 

Также доступны перегрузки с типом.

Создайте вспомогательный class и примените его к атрибуту свойства

Класс помощника:

 public class ESDateTimeConverter : IsoDateTimeConverter { public ESDateTimeConverter() { base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffZ"; } } 

Ваш код используется следующим образом:

 [JsonConverter(typeof(ESDateTimeConverter))] public DateTime timestamp { get; set; } 
  • C # JSON.NET - десериализация ответа, использующего необычную структуру данных
  • Как я могу разобрать строку JSON, которая приведет к незаконным идентификаторам C #?
  • Порядок сериализованных полей с использованием JSON.NET
  • Десериализация JSON с использованием JSon.NET с динамическими данными
  • JSON.Net выдает StackOverflowException при использовании
  • JToken: получить исходное / оригинальное значение JSON
  • Как преобразовать массив Json в список объектов в c #
  • Json.Net добавляет $ id к объектам EF, несмотря на то, что PreserveReferencesHandling указывает на "None"
  • Создание десериализации свойств, но не сериализация с помощью json.net
  • Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
  • Разбор массива JSON с использованием Json.Net
  • Давайте будем гением компьютера.