为什么Json.NET Parser会自动本地化它正在解析的日期?

时间:2014-02-06 20:43:10

标签: c# .net-4.0 json.net deserialization

我遇到了Json.NET Parser的问题。根据{{​​3}},只使用没有特殊转换器的ToString()就可以保持Json不变。

然而,我的Json字符串正在被修改,它的日期会自动本地化,并且它会给我带来各种各样的问题。例如,当我向它提供以下字符串时:

{
    "_type": "Basic",
    "id": "44902a0f-7842-3a2d-83bf-a874ce0b47a1",
    "description": "TestBasicDescription",
    "participation": 1.000000000000000,
    "inception_date": "2014-02-06T20:34:00.925000+00:00",
    "expiry_date": "0001-01-01T00:00:00+00:00"
}

我希望代码

Newtonsoft.Json.Linq.JObject.Parse(content).ToString(Formatting.None);

生成一个几乎相同的字符串。然而,我得到的是:

{
    "_type": "Basic",
    "id": "44902a0f-7842-3a2d-83bf-a874ce0b47a1",
    "description": "TestBasicDescription",
    "participation": 1.0,
    "inception_date": "2014-02-06T16:34:00.925-04:00",
    "expiry_date": "0001-01-01T20:00:00-04:00"
}

如您所见,我的日期已经过本地化。

更糟糕的是,在边界日期的情况下(如上图所示DateTime.MinValue),这个自动本地化的值实际上是错误。时区偏移导致小时值环绕,并且由于日期不能更低,它不会改变,有效地将日期转换为DateTime.MinValue加1天:当它转换回UTC时间时(如它原来是)日期变为"0001-01-02T00:00:00+00:00"。提示单元测试爆炸。

为什么Json.Net的表现不像它应该表现的那样?有没有办法解析输入Json然后ToString()完全原样?

1 个答案:

答案 0 :(得分:7)

等待@JonSkeet!回来取消删除你的答案!

相关的序列化设置如下:DateParseHandling = Newtonsoft.Json.DateParseHandling.None(你提到过),我只是不知道如何在这个场景中应用它直到@ L.B。提到了JsonConverter。

这解决了这个问题。

Newtonsoft.Json.JsonConvert.DeserializeObject(content, 
    new Newtonsoft.Json.JsonSerializerSettings() { 
    DateParseHandling = Newtonsoft.Json.DateParseHandling.None }).ToString();

给我回复:"expiry_date": "0001-01-01T00:00:00+00:00"。仍然非常怀疑默认行为是弄乱你的狗屎,但你去了:)