Json.Net无法反序列化DateTime.MinValue

时间:2014-02-06 22:46:04

标签: c# json json.net deserialization

我尝试以各种可能的方式反序列化包含DateTime.MinValue的Json字符串,但是在我的对象上调用set方法时。日期始终从-01-01-01-更改为-01-01-02 - 。

正在解析的Json显然包含

"inception_date": "0001-01-01T00:00:00+00:00"

然后我就打电话给JsonConvert

return JsonConvert.DeserializeObject<T>(json, deserializerSettings);

其中T是包含属性的基本结构:DateTime inception_date { get; set; }属性。解串器设置如下:

deserializerSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateParseHandling = Newtonsoft.Json.DateParseHandling.None,
    DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
};

然而,在Newtonsoft.Json.dll的内容中,上述时间转换为以下jObject

"inception_date": "0001-01-02T00:00:00Z"

我无法进入他们的代码,但是在我的代码看到另一个调用之前已经完成了损坏。 JsonConverter中的ReadJson调用serializer.Populate(jObject.CreateReader(), target);,其中target是我的班级T的一个实例,jObject以某种方式使用上述错误日期进行渲染。

任何人都可以弄清楚为什么会发生这种情况或我如何阻止它? jObject似乎是以忽略我的序列化设置的方式创建的,明确表示不要使用日期字符串(DateParseHandling.None)。


我已经拍摄了屏幕截图,以说明Newtonsoft的JsonConvert方法似乎已失去重要配置值的确切位置。

正如您所看到的,这是我调用JsonConvert的代码中的要点:

enter image description here

dateParseHandling值设置为无,这就是它应该如何工作。

在接下来的步骤中,我跳了几个内部Newtonsoft来电,并登陆了JsonConverter的通用实现,我从一个已接受的reference implementation借来的,可以看到发生了什么事。传入的JsonReader突然失去了dateParseHandling值:

enter image description here

由于此值被切换回DateTime - jObject的内部工作尝试将其表示为内部本地化DateTime,因为我的时区为负数而下溢,并且我们已经表示最小DateTime值,从而导致转换回UTC会增加一整天。

1 个答案:

答案 0 :(得分:3)

尝试:

deserializerSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateParseHandling = Newtonsoft.Json.DateParseHandling.DateTimeOffset
}

这导致我获得1/1/0001 12:00:00 AM而不是1/2/0001 12:00:00 AM

这是我的测试代码(用LINQPad编写)

void Main()
{
    var deserializerSettings = new JsonSerializerSettings()
    {
        DateFormatHandling = DateFormatHandling.IsoDateFormat,
        DateParseHandling = Newtonsoft.Json.DateParseHandling.None,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
    };
    var json = "{\"inception_date\": \"0001-01-01T00:00:00+00:00\"}";
    var parsedObj = JsonConvert.DeserializeObject<TestClass>(json, deserializerSettings);
    Console.WriteLine(parsedObj);

    deserializerSettings = new JsonSerializerSettings()
    {
        DateFormatHandling = DateFormatHandling.IsoDateFormat,
        DateParseHandling = Newtonsoft.Json.DateParseHandling.DateTimeOffset
    };
    parsedObj = JsonConvert.DeserializeObject<TestClass>(json, deserializerSettings);
    Console.WriteLine(parsedObj);
}

public class TestClass
{
    public DateTime inception_date {get;set;}
}

输出:

OutputFromProgram