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

C# Json.Net无法反序列化DateTime.MinValue,c#,json,json.net,deserialization,C#,Json,Json.net,Deserialization,我尝试以各种可能的方式对包含DateTime.MinValue的Json字符串进行反序列化,但是当对我的对象调用set方法时。日期总是从-01-01-01-更改为-01-01-02- 正在解析的Json清楚地包含 "inception_date": "0001-01-01T00:00:00+00:00" 然后,我对它调用jsonvert: return JsonConvert.DeserializeObject<T>(json, deserializerSettings); 然而

我尝试以各种可能的方式对包含
DateTime.MinValue
的Json字符串进行反序列化,但是当对我的对象调用
set
方法时。日期总是从-01-01-01-更改为-01-01-02-

正在解析的Json清楚地包含

"inception_date": "0001-01-01T00:00:00+00:00"
然后,我对它调用
jsonvert

return JsonConvert.DeserializeObject<T>(json, deserializerSettings);
然而,在Newtonsoft.Json.dll的内部某处,上述时间被转换为以下
jObject

"inception_date": "0001-01-02T00:00:00Z"
我没有办法进入他们的代码,但是在我的代码看到另一个调用之前,破坏已经完成了ReadJson调用
serializer.Populate(jObject.CreateReader(),target)
其中
target
是我的类
T
的一个实例,
jObject
以某种方式使用上述不正确的日期呈现

有人能找出为什么会发生这种情况,或者我怎样才能预防它吗?jObject的创建方式似乎忽略了我的序列化程序设置,该设置明确表示不要使用日期字符串(
DateParseHandling.None


我拍摄了一些屏幕截图,以准确说明Newtonsoft的JsonConvert方法似乎丢失了一个重要的配置值

如您所见,这就是我在代码中调用JsonConvert的地方:

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

在下一步中,我跳过了几个内部
Newtonsoft
调用,进入了
JsonConverter
的通用实现,我从一个accepted中借用了它,以便能够看到发生了什么。传入的
JsonReader
突然丢失了
dateParseHandling
值:

由于此值被切换回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=“{\'起始日期\':\'0001-01-01T00:00:00+00:00\”;
var parsedObj=JsonConvert.DeserializeObject(json,deserializerSettings);
Console.WriteLine(parsedObj);
deserializerSettings=新的JsonSerializerSettings()
{
DateFormatHandling=DateFormatHandling.IsoDateFormat,
DateParseHandling=Newtonsoft.Json.DateParseHandling.DateTimeOffset
};
parsedObj=JsonConvert.DeserializeObject(json,deserializerSettings);
Console.WriteLine(parsedObj);
}
公共类TestClass
{
public DateTime inception_date{get;set;}
}
产出:


与您以前的(JObject.Parse)类似,为什么要使用
序列化程序。填充
。使用带有适当设置的
JsonConvert.SerializeObject
。这一切都与如何使用Swiss army Knife有关。根据Json.Net的文档,您提供的示例datetime不需要任何序列化程序设置。你在没有任何额外设置的情况下试过吗?@PeteGarafano是的,文档肯定是误导性的。如果您不使用任何设置,默认情况下它会使用您的区域设置。@L.B正如您在我的第一个屏幕截图中看到的,我肯定是在使用带有适当设置的
jsonvert.SerializeObject
,但它在我的对象中输入了错误的日期。我使用在线发布的
JsonCreationConverter
引入了对
JsonConverter
的覆盖,这样我就可以在更深一层添加一个断点,看看发生了什么。@Alain很抱歉,但图像支持的问题可读性不强。这看起来很有希望,但我感到震惊的是,它对你有效,而不是对我有效。我传递的是完全相同的json:
“{\”到期日\\:\“0001-01-01T00:00:00+00:00\”}
但是使用这些配置选项(没有其他选项),我在Newtonsoft.json.JsonReader.ReadAsDateTimeInternal()上得到了一个异常
InvalidCastException在c:\Dev\Releases\Working\Newtonsoft.Json\Src\Newtonsoft.Json\JsonReader.cs中:第613行
。我想知道我的JSON.Net版本是否有bug?(V4.5.5.14908)哇,他们在V6上。我不知道我落后了这么远——我想我是在几个月前才得到他们的最新消息的。至少现在我今晚可以放心了,心中有一个潜在的决心。谢谢,如果这样做有效的话,你会得到积分的!NuGet的好处如果你能在你的项目中使用它,它将帮助你跟上时代。我得到了最新的,但它仍然不起作用。事实上,它无法使用这些设置转换任何日期。这次我也冒昧地下载了源代码。“无法将(DateTimeOffset)取消装箱为'System.DateTime'。您在测试中使用了.NET 4.0或4.5吗?我想知道他们依赖隐式转换的方式在这里是否不起作用…
if(TokenType==JsonToken.Date)return(DateTime)值;
(Newtonsoft.Json.JsonReader.ReadAsDateTimeInternal()行708)LINQPad默认为计算机上安装的.NET的最新版本,因此我使用了4.5。您使用的是什么?另外,您的区域性字符串是什么,以便我可以在.NET中尝试使用您的本地区域性。
deserializerSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateParseHandling = Newtonsoft.Json.DateParseHandling.DateTimeOffset
}
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;}
}