JSON
的日期字段格式为
"Date":"2016-04-22T00:00:00.000+0000"
当它被RestSharp反序列化时,日期等于
"04/22/2016 03:00:00"
经过简单调查后,我了解到RestSharp会自动为解析日期应用UTC偏移量。但在我的情况下,我需要诚实地获得JSON中存储的内容。
RestSharp是否有办法禁用JSON中日期字段的自动应用UTC偏移量?
提前致谢
答案 0 :(得分:0)
RestSharp可能会使用.Net DateTime方法将字符串解析为DateTime类型。 DateTime.Parse方法将输入字符串转换为从“控制面板”中的“区域和语言”选项中读取的时区。如果您不希望这种情况发生,则应为Parse函数提供不同的Culture设置(例如InvariantCulture)。如果您无法控制RestSharp代码,则可以在调用RestSharp方法之前设置线程文化,使用System.Threading.Thread.CurrentThread.CurrentCulture。如果RestSharp在不同的线程上运行,这将不起作用。在这种情况下,您可以通过执行自己的DateTime转换来转换输入字符串,从而抵消本地计算机时区差异。然后,您可以再次将其转换为正确的字符串格式,并将其用作RestSharp的输入。
答案 1 :(得分:0)
似乎UTC JSON DateTime
字符串"2016-04-22T00:00:00.000+0000"
已转换为本地DateTime
对象"04/22/2016 03:00:00"
。
一种方法是将每个DateTimeKind
对象的DateTime
指定为Local
,然后将其转换回UTC
。见this:
更好的方法是使用Json.Net进行序列化。我用它喜欢这个:
private class MyWrappedRestClient : RestClient
{
public MyWrappedRestClient(string baseUrl) : base(baseUrl) { }
private IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse rawResponse)
{
request.OnBeforeDeserialization(rawResponse);
var restResponse = (IRestResponse<T>)new RestResponse<T>();
try
{
restResponse = rawResponse.ToAsyncResponse<T>();
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));
}
}