Указание пользовательского формата 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; } 
  • Json.NET (Newtonsoft.Json) - Два «свойства» с таким же именем?
  • JToken: получить исходное / оригинальное значение JSON
  • Преобразовать Newtonsoft.Json.Linq.JArray в список определенного типа объекта
  • JSON.Net Обнаружен собственный цикл привязки
  • Что такое эквивалент JSON.NET XPath, SelectNodes XML, SelectSingleNode?
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • Как обрабатывать как отдельный элемент, так и массив для одного и того же свойства с помощью JSON.net
  • Web API 2: как вернуть JSON с именами свойств camelCased, на объекты и их под-объекты
  • Может ли Json.NET сериализовать / десериализовать в / из streamа?
  • Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
  • Уничтожить вложенные JSON в объекты C #
  • Давайте будем гением компьютера.