Выбрав пользовательский формат даты и времени при сериализации с Json.Net


Я занимаюсь разработкой API, чтобы разоблачить некоторые данные через веб ASP.NET API-интерфейс.

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

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

например

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

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

5 73

5 ответов:

вы на правильном пути. Поскольку вы сказали, что не можете изменить глобальные настройки, то следующая лучшая вещь-применить

вы могли бы использовать этот подход:

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

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

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

Это использует перегрузку, которая принимает

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

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

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

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

вспомогательный класс:

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

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

[JsonConverter(typeof(ESDateTimeConverter))]
public DateTime timestamp { get; set; }