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



我遇到了json.net解析器的问题。根据文档,只需使用没有特殊转换器的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() 正好

等待@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"。仍然非常怀疑默认行为是弄乱您的狗屎,但是您去了:)

相关内容

  • 没有找到相关文章

最新更新