gpt4 book ai didi

c# - Json.Net 无法反序列化 DateTime.MinValue

转载 作者:太空狗 更新时间:2023-10-29 23:31:26 24 4
gpt4 key购买 nike

我已经尝试以各种可能的方式反序列化包含 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;放; 属性。反序列化器设置如下:

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 的地方:

enter image description here

dateParseHandling 值设置为 None,这就是它应该如何工作。

在下一步中,我跳过了一些内部 Newtonsoft 调用,并着陆了我从已接受的 reference implementation 借来的 JsonConverter 的通用实现。能够看到发生了什么。传入的 JsonReader 突然丢失了那个 dateParseHandling 值:

enter image description here

由于这个值被切换回 DateTime - jObject 的内部工作试图将其表示为内部本地化的 DateTime,由于我的时区是负数,它会下溢,而我们已经表示最小 DateTime 值,导致转换回 UTC 会增加一整天。

最佳答案

尝试:

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;}
}

输出:

OutputFromProgram

关于c# - Json.Net 无法反序列化 DateTime.MinValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21615738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com