我们有一个MVC.Core项目,我们在将DateTime值从字符串反序列化为DateTime属性时遇到了问题。
以下是一个例子:
public class TestClass
{
public RecordStatus RecordStatus { get; set; } = RecordStatus.Active;
[System.ComponentModel.Browsable(false)]
public DateTime CreatedOn { get; private set; }
}
string s = @"{""recordStatus"":""Active"",""createdOn"":""2018-03-02T21:39:22.075Z""}";
JsonSerializerSettings jsonSettings = new JsonSerializerSettings()
{
DateFormatString = "yyyy-MM-ddTHH:mm:ss.FFFZ",
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
MissingMemberHandling = MissingMemberHandling.Ignore
};
TestClass psm = JsonConvert.DeserializeObject<TestClass>(s, jsonSettings);
psm.CreatedOn的值设置为
{1/1/0001 12:00:00 AM}
我为序列化设置尝试了一堆不同的值组合而没有运气。我在这里错过了什么?我知道我错过了一些明显的东西,但那些日子已经过去了。
由于
答案 0 :(得分:2)
这里的问题不是格式字符串,这很好(我们在这里可以看到):
Console.WriteLine(DateTime.ParseExact("2018-03-02T21:39:22.075Z","yyyy-MM-ddTHH:mm:ss.FFFZ", CultureInfo.InvariantCulture));
收率:
02-Mar-18 4:39:22 PM
问题实际上是CreatedOn
上的私人制定者。如果你删除一切正常。实际上,它适用于默认的序列化程序设置,因此无需对该格式字符串执行任何操作。
如果您为该字段设置了私有的setter,那么我建议查看类似this的内容,以使Json.NET使用私有的setter。
答案 1 :(得分:1)
public class TestClass
{
public RecordStatus RecordStatus { get; set; } = RecordStatus.Active;
[System.ComponentModel.Browsable(false)]
public DateTime CreatedOn { get; set; }
}
从private
属性
CreatedOn
访问修饰符