Указание пользовательского формата 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?
  • Web API 2: как вернуть JSON с именами свойств camelCased, на объекты и их под-объекты
  • Как разобрать объект JSON на C #, если я заранее не знаю ключ?
  • Json.net сериализует определенное частное поле
  • Как преобразовать escape-строку JSON в объект JSON?
  • Сериализация / десериализация пользовательской коллекции с дополнительными свойствами с помощью Json.Net
  • Дессериализация данных JSON на C # с использованием JSON.NET
  • Как использовать JSON.NET для десериализации в вложенный / рекурсивный словарь и список?
  • JSON.Net: принудительная сериализация всех частных полей и всех полей в подclassах
  • Поиск конкретного JToken по имени в иерархии JObject
  • ТипNameHandling предостережение в Newtonsoft Json
  • Давайте будем гением компьютера.