我尝试了各种可能的方式将包含 DateTime.MinValue 的 Json 字符串反序列化,但当调用我的对象的 set 方法时,日期总是从 -01-01-01- 改变为 -01-01-02-。
被解析的 Json 明显包含
我无法进入他们的代码,但在我的代码看到另一个调用之前,已经造成了损坏。JsonConverter中的ReadJson调用serializer.Populate(jObject.CreateReader(), target);,其中target是我的类T的一个实例,而jObject以某种方式呈现了上述不正确的日期。
有人能想出这是为什么或者如何防止它吗?jObject似乎是以一种忽略我的序列化程序设置的方式创建的,明确表示不要干扰日期字符串(DateParseHandling.None)。
我已经拍了屏幕截图,以说明Newtonsoft的JsonConvert方法似乎已经丢失了一个重要的配置值。
正如您所看到的,在代码中我调用JsonConvert的这一点:
被解析的 Json 明显包含
"inception_date": "0001-01-01T00:00:00+00:00"
然后我对它调用 JsonConvert
:
return JsonConvert.DeserializeObject<T>(json, deserializerSettings);
这里的 T
是一个基础结构(struct),它包含一个属性: 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
的值设置为None,这是使其正常工作所必需的。
在下一步中,我跳过了几个内部Newtonsoft
调用,并着陆在一个通用的JsonConverter
实现中,该实现是从一个已接受的参考实现中借来的,以便能够看到发生了什么。传入的JsonReader
突然失去了dateParseHandling
的值:
serializer.Populate
?使用适当的设置与JsonConvert.SerializeObject
。这都与如何使用“瑞士军刀”有关。 - L.BJsonConvert.SerializeObject
,但它将错误的日期放入了我的对象中。我引入了JsonCreationConverter<T>
上线的JsonConverter
覆盖,以便我可以添加一个更深层次的断点并查看发生了什么。 - Alain