IsoDateTimeConverter и JsonSerializerSettings: дифференцируйте DateTime с DateTimeOffset - PullRequest
0 голосов
/ 26 февраля 2020

В моих C# моделях я использую и DateTime и DateTimeOffset, например:

   class Foo 
   {
        public DateTime Date { get; set; }
        public DateTimeOffset CreationDate { get; set; }
   } 

Когда я сериализуюсь в JSON, я делаю это так:

  Foo foo = new Foo();
  foo.Date = DateTime.UtcNow;
  foo.CreationDate = DateTime.UtcNow;

  var isoDateTimeConverter = new IsoDateTimeConverter();
  isoDateTimeConverter.DateTimeFormat = "yyyy'-'MM'-'dd";

  var serializerSettings = new JsonSerializerSettings();
  serializerSettings.Converters.Add(isoDateTimeConverter);

  JsonSerializer serializer = JsonSerializer.Create(serializerSettings);
  serializer.Serialize(writer, foo);

Это будет производить JSON:

 {
     Date = "2019-02-26",
     CreationDate = "2019-02-26"
 }

И Date, и CreationDate сериализуются одинаково из-за IsoDateTimeConverter

Что я Мне бы хотелось сделать различие между сериализацией DateTime и DateTimeOffset

Моя цель - получить это JSON:

 {
     Date = "2019-02-26",
     CreationDate = "2019-02-26T12:03:00-03:00"
 }

Как мне добиться this?

Дополнительная информация:

  • Когда моя C# модель использует DateTime, я сохраняю ее как Date в SQL Сервер
  • Когда моя C# модель использует DateTimeOffset, я сохраняю ее как DateTimeOffset на SQL сервере
  • Я использую EF Code First

1 Ответ

1 голос
/ 26 февраля 2020

Вы можете попробовать это

public class DateFormatConverter : IsoDateTimeConverter
{
    public DateFormatConverter(string format)
    {
        DateTimeFormat = format;
    }
}

Укажите формат для каждого Date свойства

public class Foo
{
    [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")]
    public DateTime Date { get; set; }

    [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-ddTHH:mm:ssK")]
    public DateTimeOffset CreationDate { get; set; }
}

Без дополнительных настроек вы можете Serialize

Foo foo = new Foo();
foo.Date = DateTime.UtcNow;
foo.CreationDate = DateTime.UtcNow;

string isoJson = JsonConvert.SerializeObject(foo);

ВЫХОД

{"Date":"2020-02-26","CreationDate":"2020-02-26T15:30:19-03:00"}
...