C# 为什么RestSharp反序列化两个日期的方式不同?
我有一个rest调用返回此消息(使用Chrome中的AdvanceREST客户端进行测试): 获取响应并将其序列化为对象的代码如下所示:C# 为什么RestSharp反序列化两个日期的方式不同?,c#,.net,asp.net-web-api,deserialization,restsharp,C#,.net,Asp.net Web Api,Deserialization,Restsharp,我有一个rest调用返回此消息(使用Chrome中的AdvanceREST客户端进行测试): 获取响应并将其序列化为对象的代码如下所示: IRestResponse<List<MyObject>> response = client.Execute<List<MyObject>>(request); IRestResponse response=client.Execute(请求); 当我查看响应对象时,其中一个日期是错误的。如果我检查它或以任
IRestResponse<List<MyObject>> response = client.Execute<List<MyObject>>(request);
IRestResponse response=client.Execute(请求);
当我查看响应对象时,其中一个日期是错误的。如果我检查它或以任何方式使用对象,我会得到:
UTC1: 4/19/2013 3:12
UTC2: 4/18/2013 9:12:36 PM <--CONVERTED!!
UTC1:4/19/2013 3:12
UTC2:4/18/2013 9:12:36 PM用于执行反序列化,而不是内置的RestSharp反序列化程序
response = client.Execute(request);
var myObjects = JsonConvert.Deserialize<List<MyObject>>(response)
response=client.Execute(请求);
var myObjects=JsonConvert.Deserialize(响应)
为方便起见发布此消息:
private class CustomRestClient : RestClient
{
public CustomRestClient(string baseUrl) : base(baseUrl) { }
private IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse raw)
{
request.OnBeforeDeserialization(raw);
var restResponse = (IRestResponse<T>)new RestResponse<T>();
try
{
restResponse = ResponseExtensions.toAsyncResponse<T>(raw);
restResponse.Request = request;
if (restResponse.ErrorException == null)
{
restResponse.Data = JsonConvert.DeserializeObject<T>(restResponse.Content);
}
}
catch (Exception ex)
{
restResponse.ResponseStatus = ResponseStatus.Error;
restResponse.ErrorMessage = ex.Message;
restResponse.ErrorException = ex;
}
return restResponse;
}
public override IRestResponse<T> Execute<T>(IRestRequest request)
{
return Deserialize<T>(request, Execute(request));
}
}
私有类CustomRestClient:RestClient
{
公共CustomRestClient(字符串baseUrl):基(baseUrl){}
私有IRestResponse反序列化(IRestRequest请求,IRestResponse原始)
{
请求。onbefore反序列化(原始);
var restreponse=(IRestResponse)new restreponse();
尝试
{
restResponse=ResponseExtensions.toAsyncResponse(原始);
resresponse.Request=请求;
if(resresponse.ErrorException==null)
{
restResponse.Data=JsonConvert.DeserializeObject(restResponse.Content);
}
}
捕获(例外情况除外)
{
resresponse.ResponseStatus=ResponseStatus.Error;
restResponse.ErrorMessage=ex.Message;
restResponse.ErrorException=ex;
}
返回重响应;
}
公共覆盖IRestResponse执行(IRestRequest请求)
{
返回反序列化(请求、执行(请求));
}
}
这是我编写的一个简单代码,它只覆盖Execute
,并在后台使用Json.net。两者都是UTC日期时间的有效ISO8601表示形式(部分中的位数没有限制)。尝试使用逗号作为分隔符-我相信最初的分隔符是点,但根据更新版本的建议,使用逗号…在MyObject中,UTC1和UTC2定义为相同的类型吗?@cgotberg,是的,它们是相同的类型(DateTime)。我在Newtonsoft.Json中尝试了您的示例,但它没有执行奇怪的datetimeoffset切换。您可以使用RestSharp获取原始响应,然后使用var myObject=JsonConvert.Deserialize(jsonString)进行反序列化。@cgotberg,谢谢。如果你想把它作为答案,我会接受的——除了改变当前计算机的时区,我想不出其他方法来解决这个问题
private class CustomRestClient : RestClient
{
public CustomRestClient(string baseUrl) : base(baseUrl) { }
private IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse raw)
{
request.OnBeforeDeserialization(raw);
var restResponse = (IRestResponse<T>)new RestResponse<T>();
try
{
restResponse = ResponseExtensions.toAsyncResponse<T>(raw);
restResponse.Request = request;
if (restResponse.ErrorException == null)
{
restResponse.Data = JsonConvert.DeserializeObject<T>(restResponse.Content);
}
}
catch (Exception ex)
{
restResponse.ResponseStatus = ResponseStatus.Error;
restResponse.ErrorMessage = ex.Message;
restResponse.ErrorException = ex;
}
return restResponse;
}
public override IRestResponse<T> Execute<T>(IRestRequest request)
{
return Deserialize<T>(request, Execute(request));
}
}