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