我尝试以各种可能的方式反序列化包含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的代码中的要点:
dateParseHandling
值设置为无,这就是它应该如何工作。
在接下来的步骤中,我跳了几个内部Newtonsoft
来电,并登陆了JsonConverter
的通用实现,我从一个已接受的reference implementation借来的,可以看到发生了什么事。传入的JsonReader
突然失去了dateParseHandling
值:
由于此值被切换回DateTime - jObject的内部工作尝试将其表示为内部本地化DateTime,因为我的时区为负数而下溢,并且我们已经表示最小DateTime值,从而导致转换回UTC会增加一整天。
答案 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;}
}
输出: