C# - 禁用日期JSON的自动UTC偏移

时间:2016-04-22 09:48:01

标签: c# restsharp

我从应用程序获得的

JSON的日期字段格式为

"Date":"2016-04-22T00:00:00.000+0000"

当它被RestSharp反序列化时,日期等于

"04/22/2016 03:00:00"

经过简单调查后,我了解到RestSharp会自动为解析日期应用UTC偏移量。但在我的情况下,我需要诚实地获得JSON中存储的内容。

RestSharp是否有办法禁用JSON中日期字段的自动应用UTC偏移量?

提前致谢

2 个答案:

答案 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));
    }
}