Вопрос:

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

c# datetime asp.net-web-api json.net

100966 просмотра

7 ответа

1508 Репутация автора

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

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

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

например

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

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

Автор: Stay Foolish Источник Размещён: 05.09.2013 11:52

Ответы (7)


126 плюса

81381 Репутация автора

Решение

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

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

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

Автор: Brian Rogers Размещён: 05.09.2013 03:03

40 плюса

14128 Репутация автора

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

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

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

Автор: Saeb Amini Размещён: 23.03.2016 09:31

12 плюса

4844 Репутация автора

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

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" });

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

Автор: Matt Размещён: 29.04.2016 04:25

60 плюса

719 Репутация автора

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

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

Автор: Keith Hill Размещён: 03.07.2017 08:30

4 плюса

8695 Репутация автора

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

Хелпер класс:

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

Ваш код использовать так:

[JsonConverter(typeof(ESDateTimeConverter))]
public DateTime timestamp { get; set; }
Автор: Xin Размещён: 21.05.2018 06:21

0 плюса

115 Репутация автора

Иногда декорирование атрибута json convert не будет работать, за исключением того, что « 2010-10-01» является допустимой датой . Чтобы избежать этого, я удалил атрибут json convert в свойстве и упомянул в методе deserilizedObject, как показано ниже.

var addresss = JsonConvert.DeserializeObject<AddressHistory>(address, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" });
Автор: Muni Chittem Размещён: 30.11.2018 10:20

1 плюс

73 Репутация автора

Есть еще одно решение, которое я использовал. Просто создайте строковое свойство и используйте его для json. Это свойство вернет дату, правильно отформатированную.

class JSonModel {
    ...

    private DateTime myDate;
    [JsonProperty("date")]
    public string CustomDate {
        get { return myDate.ToString("DDMMYY"); }
        set { myDate = DateTime.Parse(value); }
    }

    ...
}

Таким образом, вам не нужно создавать дополнительные классы. Кроме того, он позволяет создавать разные форматы данных. Например, вы можете легко создать другое свойство для часа, используя тот же DateTime.

Автор: anrodse Размещён: 05.04.2019 11:38
Вопросы из категории :
32x32