IsoDateTimeConverter 和 JsonSerializerSettings:区分 DateTime 和 DateTimeOffset

Posted

技术标签:

【中文标题】IsoDateTimeConverter 和 JsonSerializerSettings:区分 DateTime 和 DateTimeOffset【英文标题】:IsoDateTimeConverter and JsonSerializerSettings: differentiate DateTime with 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 代码优先

【问题讨论】:

【参考方案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

以上是关于IsoDateTimeConverter 和 JsonSerializerSettings:区分 DateTime 和 DateTimeOffset的主要内容,如果未能解决你的问题,请参考以下文章

Newtonsoft post Json 日期格式处理

D3.js 和 Cytoscape.js 有啥区别? [关闭]

Highland.js、Kefir.js 和 Rx.js 之间的区别特征是啥?

shopify中的.js和.js.liquid有啥区别?

关于app.js和route.js和service.js还有controller.js中的依赖关系

ADAL.js 和 MSAL.js 有啥区别?