【问题标题】:IsoDateTimeConverter and JsonSerializerSettings: differentiate DateTime with DateTimeOffsetIsoDateTimeConverter 和 JsonSerializerSettings:区分 DateTime 和 DateTimeOffset
【发布时间】:2020-06-10 12:00:40
【问题描述】:

在我的 C# 模型中,我同时使用 DateTimeDateTimeOffset,例如:

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

由于IsoDateTimeConverterDateCreationDate 都以相同的方式序列化

我想做的是区分DateTimeDateTimeOffset的序列化

我的目标是得到这个 JSON:

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

我怎样才能做到这一点?

附加信息:

  • 当我的 C# 模型使用 DateTime 时,我在 SQL Server 中将其另存为 Date
  • 当我的 C# 模型使用 DateTimeOffset 时,我在 SQL Server 中将其另存为 DateTimeOffset
  • 我使用的是 EF 代码优先

【问题讨论】:

    标签: c# datetimeoffset jsonserializer


    【解决方案1】:

    你可以试试这个

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

    【讨论】:

    • 它正在抛出:JsonconverterAttribute does not contain a constructor that takes 2 arguments
    • 通过将 Newtonsoft.Json 从 5.0.8 更新到 12.0.3 解决了上述错误
    • 完美?@sports
    猜你喜欢
    • 2012-02-22
    • 2018-08-29
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多