4

我有一个返回这个的休息调用(使用 Chrome 中的 Advance Rest Client 进行测试):

MyObject: [22]
0:  {
ID: "123456"
UTC1: "2013-04-19T03:12:32Z"
UTC2: "2013-04-19T03:12:36.994Z"
}

获取响应并将其序列化为对象的代码如下所示:

IRestResponse<List<MyObject>> response = client.Execute<List<MyObject>>(request);

当我查看响应对象时,其中一个日期是错误的。如果我检查它或以任何方式使用这些对象,我会得到:

UTC1: 4/19/2013 3:12     
UTC2: 4/18/2013 9:12:36 PM <--CONVERTED!!

我需要将两者都序列化为响应中返回的时间,而不是从 UTC/GMT 转换为本地时间。如您所见,上面一个值保持其 UTC 值,而另一个值转换为我的时区。我认为两者都是通过 Convert.DateTime 函数运行的,但是如果我对字符串执行此操作,则两个值都会转换为本地时间。我意识到原始值中的一个(正在转换的那个)并不完全符合 ISO 8601 格式(精度太高);不幸的是,这是我现在必须使用的数据。

谁能告诉我如何强制 RestSharp 确保两个日期都在 UTC 中?

4

2 回答 2

8

使用Json.NET进行反序列化,而不是内置的 RestSharp 反序列化器。

response = client.Execute(request);    
var myObjects = JsonConvert.Deserialize<List<MyObject>>(response)
于 2013-04-23T19:51:48.193 回答
1

为方便起见发布此信息:

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

这是我放在一起的一个简单代码,它只是在底层覆盖Execute<T>并使用 Json.net。

于 2014-08-09T13:22:38.353 回答