C#Newtonsoft JsonConvert无法正确反序列化DateTime

时间:2018-03-08 19:22:19

标签: c# json json.net

我们有一个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}

我为序列化设置尝试了一堆不同的值组合而没有运气。我在这里错过了什么?我知道我错过了一些明显的东西,但那些日子已经过去了。

由于

2 个答案:

答案 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属性

的setter中删除CreatedOn访问修饰符