Я разрабатываю API для предоставления некоторых данных с использованием ASP.NET Web API.
В одном из API клиент хочет, чтобы мы выставили дату в yyyy-MM-dd
формате. Я не хочу изменять глобальные настройки (например GlobalConfiguration.Configuration.Formatters.JsonFormatter
) для этого, так как это очень специфично для этого клиента. И я занимаюсь разработкой этого решения для нескольких клиентов.
Одним из решений, которое я мог бы придумать, является создание пользовательского JsonConverter
и добавление его к свойству, которое мне нужно для пользовательского форматирования.
например
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Просто интересно, есть ли другой простой способ сделать это.
c#
datetime
asp.net-web-api
json.net
Оставаться глупым
источник
источник
Ответы:
Ты на правильном пути. Так как вы сказали, что не можете изменять глобальные настройки, то лучше всего применять
JsonConverter
атрибут по мере необходимости, как вы и предлагали. Оказывается, в Json.Net уже есть встроенная функцияIsoDateTimeConverter
, позволяющая указать формат даты. К сожалению, вы не можете установить формат черезJsonConverter
атрибут, так как единственным аргументом атрибута является тип. Однако есть простое решение: создать подклассIsoDateTimeConverter
, затем указать формат даты в конструкторе подкласса. ПрименитеJsonConverter
атрибут там, где это необходимо, указав свой собственный конвертер, и вы готовы к работе. Вот весь необходимый код:Если вы также не против иметь время, вам даже не нужно создавать подкласс IsoDateTimeConverter. Формат даты по умолчанию
yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK
(как видно из исходного кода ).источник
IsonDateTimeConverter
был взят непосредственно из исходного кода Json.Net ; поэтому я возвращаю ваше редактирование по этому вопросу.Вы можете использовать этот подход:
И используйте это так:
В строке DateTimeFormat используется синтаксис строки формата .NET, описанный здесь: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
источник
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
это означает, что ваша версия json.net слишком старая. Вам необходимо выполнить обновление до последней версии json.net.Это также может быть сделано с
IsoDateTimeConverter
экземпляром, без изменения глобальных настроек форматирования:Это использует
JsonConvert.SerializeObject
перегрузку, которая принимаетparams JsonConverter[]
аргумент.источник
Также доступно использование одной из перегрузок настроек сериализатора:
Или
Перегрузки, принимающие Тип, также доступны.
источник
yyyy-MM-ddTHH:mm:ssZ
... 24 часа в сутки.Создайте вспомогательный класс и примените его к атрибуту вашего свойства
Хелпер класс:
Ваш код использовать так:
источник
Есть еще одно решение, которое я использовал. Просто создайте строковое свойство и используйте его для json. Это свойство вернет дату, правильно отформатированную.
Таким образом, вам не нужно создавать дополнительные классы. Кроме того, он позволяет создавать разные форматы данных. Например, вы можете легко создать другое свойство для часа, используя тот же DateTime.
источник
Иногда декорирование атрибута json convert не будет работать, за исключением того, что « 2010-10-01» является допустимой датой . Чтобы избежать этого, я удалил атрибут json convert в свойстве и упомянул в методе deserilizedObject, как показано ниже.
источник
С ниже конвертер
Можно использовать его с пользовательским форматом по умолчанию
Или любой указанный формат для свойства
источник