IsoDateTimeConverter 和 JsonSerializerSettings:区分 DateTime 和 DateTimeOffset
Posted
技术标签:
【中文标题】IsoDateTimeConverter 和 JsonSerializerSettings:区分 DateTime 和 DateTimeOffset【英文标题】:IsoDateTimeConverter and JsonSerializerSettings: differentiate DateTime with DateTimeOffset 【发布时间】:2020-06-10 12:00:40 【问题描述】:在我的 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"
由于IsoDateTimeConverter
,Date
和 CreationDate
都以相同的方式序列化
我想做的是区分DateTime
和DateTimeOffset
的序列化
我的目标是得到这个 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的主要内容,如果未能解决你的问题,请参考以下文章
D3.js 和 Cytoscape.js 有啥区别? [关闭]
Highland.js、Kefir.js 和 Rx.js 之间的区别特征是啥?