我遇到了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()
它完全原样?
答案 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"
。仍然非常怀疑默认行为是弄乱你的狗屎,但你去了:)